文件流的分類
1. 字節流
所有字節流實現類都繼承自抽象類InputStream和OutputStream,下面是一些常用的字節流(輸入流和輸出流都是一一對應的)
- FileInputStream:實現對文件字節的讀取操作
- ByteArrayInputStream:把內存中的一個緩衝區作爲輸入源,從內存數組中讀取數據字節(一般用來操作用戶的輸入)。
- ObjectInputStream:將用ObjectOutputStream寫入的的文件讀取出來,序列化的類應實現Serializable接口
- PipeInputStream:實現了管道的概念,從線程通道中讀取線程字節。主要在線程中使用,用於兩個線程間通信。
- SequenceInputStream:表示其他輸入流的邏輯串聯。它從輸入流的有序集合開始,並從第一個輸入流開始讀取,直到到達文件末尾,接着從第二個輸入流讀取,依次類推,直到到達包含的最後一個輸入流的文件末尾爲止。
- System.in:從用戶控制檯讀取數據字節,在System類中,in是 InputStream 類的靜態導入。
// 獲取輸入流
InputStream fis = new FileInputStream("D:/a.png");
// 獲取輸出流
OutputStream fos = new FileOutputStream("D:/b.png");
// 臨時存放字節的數組
byte[] bytes = new byte[1024];
// 檢查是否到達文件尾(字節流到達文件爲返回-1)
int i;
while ((i = fis.read(bytes)) != -1){
// 實際上底層都是調用write(bytes, 0, bytes.length())
fos.write(bytes);
}
// 關閉輸入流
fis.close();
// 關閉輸出流
fos.close();
2. 字符流
字符流和字節流使用基本相同,只不過字符流都是繼承自抽象類Reader和Writer(一般用來處理文本文件)
Reader reader = new FileReader("D:/a.txt");
Writer writer = new FileWriter("D:/b.txt");
char[] chars = new char[1024];
int i;
while ((i = reader.read(chars)) != -1){
writer.write(chars);
}
writer.flush();
reader.close();
writer.close();
3. 緩衝流
字節流和字符流都是直接對文件源進行操作(文件—》程序—》文件),這樣會受制於硬盤的讀寫速度,緩衝流則是把流讀出的數據先緩存到內存中,等達到緩衝區指定大小或執行flush操作時,將數據一次性寫入文件
- 字節緩衝流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:/a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/b.txt"));
byte[] bytes = new byte[2048];
int i;
while ((i = bis.read(bytes)) != -1){
// 底層都是調用write(byte[] b, int off, int len)方法,循環寫入bytes
bos.write(bytes);
// 刷新緩衝區的輸出流,使所有緩衝的輸出字節寫出到底層輸入流
bos.flush();
}
bis.close();
bos.close();
- 字符緩衝流
BufferedReader br = new BufferedReader(new FileReader("D:/a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:/b.txt"));
String line;
while ((line = br.readLine()) != null){
// 寫入一行
bw.write(line);
// 換行
bw.newLine();
}
br.close();
bw.close();
參考:https://www.cnblogs.com/jmcui/p/9096536.html