Java高階_Day10(IO流,位元組流讀寫)
阿新 • • 發佈:2021-01-14
Java高階_Day10(IO流,位元組流讀寫)
IO流
IO :輸入輸出流(input/output)
流: 是檔案資料在計算機中傳輸的一種形式
常見的操作:檔案的上傳、下載、檔案的複製
IO流中的輸入輸出是相對於程式而言:將外部儲存裝置中的檔案讀入到程式中,則為輸入 ;將程式中的資料 輸入出到外部儲存裝置 稱為輸出。
分類:
- 按照資料的流向: 輸入流(讀) 輸出流(寫)
- 按照資料的單位: 位元組流(bit) 字元流(char)
IO流的基本:
- 位元組輸入流、位元組輸出流、字元輸入流、字元輸出流
位元組流和字元流的使用場景:
字元流:純文字檔案(.txt)
位元組流讀寫
- abstract class InputStream 是所有位元組輸入流的基類
- abstract class OutputStream 是所有位元組輸出流的基類
所有的位元組輸入輸出流的子類都是以父類的名稱作為子類名稱的字尾
使用位元組輸出流寫資料
FileOutputStream 檔案輸出流是用於將資料寫入到輸出流File
- 建立位元組輸出流物件
FileOutputStream(File file)
建立檔案輸出流以寫入由指定的 File物件表示的檔案。
FileOutputStream(File file, boolean append)
FileOutputStream(String name)
建立檔案輸出流以指定的名稱寫入檔案。
FileOutputStream(String name, boolean append)
建立檔案輸出流以指定的名稱寫入檔案。 - 呼叫輸出流的相關方法,將資料寫出到指定的檔案
- 關閉流(釋放資源)
public class FileOutputStreanDemo {
public static void main(String[] args) throws IOException {
//建立位元組流輸出物件
//方式一:
//FileOutputStream fos1 = new FileOutputStream("d:\\IO\\os\\fos.txt");
// 方式二:
File file = new File("d:\\IO\\os\\fos.txt");
/*建立位元組輸出流物件時的過程:
1 當要寫出的目標檔案如果不存在 會呼叫系統相關的功能來建立一個新的檔案
2 建立FileOutputStream物件
3 讓輸出流物件指向目標檔案
*/
FileOutputStream fos = new FileOutputStream(file);
// 使用檔案位元組輸出流,向指定的檔案中寫出資料 void write(int b)
fos.write(100);//d
// 釋放資源
fos.close();
}
使用位元組輸出流完成位元組陣列的輸出:
public static void main(String[] args) throws IOException {
// 此處使用相對路徑進行表示,相對路徑時相對當前工程
// 絕對路徑一般都是從碟符開始寫
FileOutputStream fos = new FileOutputStream("day_10_IODemom\\output\\fos.txt");
// 使用位元組陣列
byte[] bytes = new byte[]{97,99,98,100,102,105,110};
// 如果要寫出一個字串Hello World
String str = "Hello World";
byte[] bytes1 = str.getBytes();// 獲取字串相對應的位元組陣列
//fos.write(bytes1);
//寫位元組陣列的一部分
fos.write(bytes1,0,5);
fos.close();
}
使用位元組輸出流實現追加寫:
FileOutputStream(String name, boolean append)
建立檔案輸出流以指定的名稱寫入檔案。FileOutputStream(File file, boolean append)
建立檔案輸出流以寫入由指定的 File物件表示的檔案。
將append的值置為true即可實現追加寫:
public static void main(String[] args) throws IOException {
// 此處使用相對路徑進行表示,相對路徑時相對當前工程
// 絕對路徑,一般都是從碟符開始寫
FileOutputStream fos = new FileOutputStream("day_10_IODemom\\output\\fos.txt",true);
// 使用位元組陣列
byte[] bytes = new byte[]{97,99,98,100,102,105,110};
fos.write(bytes);
// 如果要寫出一個字串 Hello World
String str = "Hello World";
byte[] bytes1 = str.getBytes();// 獲取字串相對應的位元組陣列
fos.write(bytes1);
//寫位元組陣列的一部分
//fos.write(bytes1,0,5);
fos.close();
}
實現換行寫的功能:
- 換行功能:
- windows \r\n
- Linux \n
- Mac: \r
public static void main(String[] args) throws IOException {
// 此處使用相對路徑進行表示,相對路徑時相對當前工程
// 絕對路徑一般都是從碟符開始寫
FileOutputStream fos = new FileOutputStream("day_10_IODemom\\output\\fos.txt",true);
// 使用位元組陣列
byte[] bytes = new byte[]{97,99,98,100,102,105,110};
fos.write(bytes);
fos.write("\r\n".getBytes());
// 如果要寫出一個字串 Hello World
String str = "Hello World";
byte[] bytes1 = str.getBytes();// 獲取字串相對應的位元組陣列
fos.write(bytes1);
fos.write("\r\n".getBytes());// 寫出換行符
//寫位元組陣列的一部分
//fos.write(bytes1,0,5);
fos.close();
}
}
IO中異常的處理方式
public static void main(String[] args) {
FileOutputStream fos= null;
try {
// 建立位元組流輸出物件
fos = new FileOutputStream("day_10_IODemom\\output\\fos_02.txt");
//寫出資料
fos.write("中北大學".getBytes());
fos.write("\r\n".getBytes());
fos.write("中國山西".getBytes(StandardCharsets.UTF_8));//使用UTF-8字符集獲取位元組陣列
}catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos != null){// 當且僅當fos不為null 才需要關閉
try {
fos.close();//此處也有可能存在異常 同樣需要處理
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
使用位元組輸入流讀資料
FileInputStream 從檔案系統中的檔案獲取輸入位元組
FileInputStream(File file)
通過開啟與實際檔案的連線建立一個 FileInputStream ,該檔案由檔案系統中的 File物件 file命名。
FileInputStream(String name)
通過開啟與實際檔案的連線來建立一個 FileInputStream ,該檔案由檔案系統中的路徑名 name命名。
讀的方法:
返回值型別 | 方法名 |
---|---|
int | read() 從該輸入流讀取一個位元組的資料。 |
int | read(byte[] b) 從該輸入流讀取最多 b.length個位元組的資料為位元組陣列。 |
int | read(byte[] b, int off, int len) 從該輸入流讀取最多 len位元組的資料為位元組陣列。 |
void | close() 關閉此檔案輸入流並釋放與流相關聯的任何系統資源。 |
public static void main(String[] args) throws IOException {
// 建立一個位元組輸入流
//1 建立檔案表示要讀取的 檔案的路徑
//2 建立FileInputStream 物件
//3 讓FileInputStream物件指向檔案,如果檔案存在 則可以使用相應的方法去 讀取 ,如果不存在 則會爆出FileNotFoundException
FileInputStream fis = new FileInputStream("day_10_IODemom\\output\\fos.txt");
/* int r;
r = fis.read();
r == -1 ; // 表示到了檔案末尾
*/
int r;
// 如果每次讀取返回的不是-1 證明檔案還沒有讀完
while( (r = fis.read()) != -1){
System.out.print((char)r);
}
// 釋放資源
fis.close();
}
使用位元組輸出流寫資料時,如果檔案不存在 ,系統會自動為我們建立一個新檔案
使用位元組輸入流讀資料時,如果檔案不存在 則會報FileNotFoundException