1、字節緩沖流
首先要明確一個概念:對文件或其他目標頻繁的讀寫操作,效率低,性能差。
使用緩沖流的好處是,能夠高效的讀寫信息,原理是將數據先緩沖起來,然后一起寫入或者讀取出來。
BufferedInputStream:為另一個輸入流添加一些功能,在創建BufferedInputStream時,會創建一個內部緩沖區數組,用於緩沖數據。
BufferedOutputStream:通過設置這種輸出流,應用程序就可以將各個字節寫入底層輸出流中,而不必針對每次字節寫入調用底層系統。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 緩存的目的:解決寫入文件操作時,頻繁的操作文件所帶來的性能降低的問題
* BufferedOutputStream內部默認的緩存大小是8kb,每次寫入時存儲到緩存中的byte數組中, 會把數組中的數據寫入文件,並且下標歸零
*/
public class BufferedStreamDemo {
public static void main(String[] args) {
byteWriter();
byteReader();
}
private static void byteReader() {
File file = new File("F:/test.txt");
try {
InputStream in = new FileInputStream(file);
// 構造一個字節緩沖流
BufferedInputStream bis = new BufferedInputStream(in);
byte[] flush = new byte[1024];
int len = -1;
while ((len = bis.read(flush)) != -1) {
System.out.println(new String(flush, 0, len));
}
bis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// byteReader
private static void byteWriter() {
File file = new File("F:/test.txt");
try {
OutputStream out = new FileOutputStream(file, true);
BufferedOutputStream bos = new BufferedOutputStream(out);
String info = "你愛Java嗎?";
bos.write(info.getBytes());
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// byteWriter
}
2、字符緩沖流
BufferedReader:從字符輸入流中讀取文本,緩沖各個字節,從而實現字符、數組和行的高效讀取。
BufferedWriter:將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
private static void charWriter() {
File file = new File("F:/test.txt");
try {
Writer writer = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(writer);
bw.write("我愛Java SE");
bw.flush();
bw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// charWriter
private static void charReader() {
File file = new File("F:/test.txt");
try {
Reader reader = new FileReader(file);
// 為字符流提供緩存,達到高效讀取的目的
BufferedReader br = new BufferedReader(reader);
char[] buf = new char[1024];
int len = -1;
while ((len = br.read(buf)) != -1) {
System.out.println(new String(buf, 0, len));
}
br.close();// 不用關閉reader,是因為關閉br時內部已經幫我們關閉了reader
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// charReader
為什么要用字符緩沖流
- 字符緩沖流: 加入字符緩沖流,增強讀取功能,新增方法readLine() 更高效的讀取
- FileReader:內部使用InputStreamReader,解碼過程,byte->char,默認緩存大小是8k
- BufferedReader:默認緩存大小是8k,但是可以手動指定大小,把數據直接讀取到緩存中,減少轉換過程的次數,效率更高。所以雖然FileReader中已經加入了緩存,仍要加上BufferedReader的原因