IO流 處理流之一:緩衝流
- 爲了提高數據讀寫的速度,Java API提供了帶緩衝功能的流類,在使用這些流類 時,會創建一個內部緩衝區數組,缺省使用8192個字節(8Kb)的緩衝區。
- 緩衝流要“套接”在相應的節點流之上,根據數據操作單位可以把緩衝流分爲:
- BufferedInputStream 和 BufferedOutputStream
- BufferedReader 和 BufferedWriter
- 當讀取數據時,數據按塊讀入緩衝區,其後的讀操作則直接訪問緩衝區
- 當使用BufferedInputStream讀取字節文件時,BufferedInputStream會一次性從 文件中讀取8192個(8Kb),存在緩衝區中,直到緩衝區裝滿了,才重新從文件中 讀取下一個8192個字節數組。
- 向流中寫入字節時,不會直接寫到文件,先寫到緩衝區中直到緩衝區寫滿, BufferedOutputStream纔會把緩衝區中的數據一次性寫到文件裏。使用方法 flush()可以強制將緩衝區的內容全部寫入輸出流
- 關閉流的順序和打開流的順序相反。只要關閉最外層流即可,關閉最外層流也 會相應關閉內層節點流
- flush()方法的使用:手動將buffer中內容寫入文件
- 如果是帶緩衝區的流對象的close()方法,不但會關閉流,還會在關閉流之前刷 新緩衝區,關閉後不能再寫出
使用緩衝流 BufferedInputStream、BufferedOutputStream實現非文本文件(圖片、mp3、mp4等)的複製
Demo:
@Test
public void BufferedStreamTest(){
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
//1.創建File類的對象,指明讀入和寫出的文件
File srcFile = new File("愛情與友情.mp4");
File destFile = new File("愛情與友情2.mp4");
//2.創建輸入流和輸出流的對象(造節點流)
FileInputStream fileInputStream = new FileInputStream(srcFile);
FileOutputStream fileOutputStream = new FileOutputStream(destFile);
//3.創建緩衝流對象(造緩衝流)
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
//3.數據的讀入和寫出的操作
byte[] buffer = new byte[1024];
int len;
while ((len = bufferedInputStream.read(buffer)) != -1 ){
bufferedOutputStream.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.資源關閉
//要求:先關閉外層的流,再關閉內層的流
//說明:關閉外層流的同時,內層流也會自動的進行關閉。關於內層流的關閉,我們可以省略.
if (bufferedOutputStream != null){
try {
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedInputStream != null){
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
使用BufferedReader和BufferedWriter實現文本文件的複製
Demo:
@Test
public void testBufferedReaderBufferedWriter() throws IOException {
//1.創建File類的對象,指明讀入和寫出的文件
File srcFile = new File("dbcp.txt");
File destFile = new File("dbcp1.txt");
//2.創建輸入流和輸出流的對象(造節點流)
FileReader fileReader = new FileReader(srcFile);
FileWriter fileWriter = new FileWriter(destFile);
//3.創建緩衝流對象(造緩衝流)
BufferedReader bufferedReader = new BufferedReader(fileReader);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//4.數據的讀入和寫出的操作
char[] buffer = new char[8];
int len;
while ((len = bufferedReader.read(buffer)) != -1){
bufferedWriter.write(buffer, 0, len);
}
//5.資源關閉
bufferedWriter.close();
bufferedReader.close();
}
@Test
public void testBufferedReaderBufferedWriter1() throws IOException {
//創建文件和相應的流
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File("dbcp.txt")));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File("dbcp2.txt")));
//方式二:使用String
String data;
while ((data = bufferedReader.readLine()) != null){
//bufferedWriter.write(data+"\n");
bufferedWriter.write(data);
bufferedWriter.newLine();
}
bufferedWriter.close();
bufferedReader.close();
}