# 緩存流
以介質是硬盤為例,**字節流和字符流的弊端**:
在每一次讀寫的時候,都會訪問硬盤。 如果讀寫的頻率比較高的時候,其性能表現不佳。
為了解決以上弊端,采用緩存流。
緩存流在讀取的時候,**會一次性讀較多的數據到緩存中**,以后每一次的讀取,都是在緩存中訪問,直到緩存中的數據讀取完畢,再到硬盤中讀取。
就好比吃飯,**不用緩存就是每吃一口都到鍋里去鏟**。**用緩存就是先把飯盛到碗里**,碗里的吃完了,再到鍋里去鏟
緩存流在寫入數據的時候,會先把數據寫入到緩存區,直到緩存區**達到一定的量**,才把這些數據,**一起寫入到硬盤中去**。按照這種操作模式,就不會像字節流,字符流那樣**每寫一個字節都訪問硬盤**,從而減少了IO操作
# 使用緩存流讀取數據
緩存字符輸入流 BufferedReader 可以一次讀取一行數據
```
package com.dodoke.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class TestSteam8 {
public static void main(String[] args) {
// 準備文件lol.txt其中的內容是
// garen kill teemo
// teemo revive after 1 minutes
// teemo try to garen, but killed again
File f = new File("d:/log.txt");
// 創建文件字符流
// 緩存流必須建立在一個存在的流的基礎上
try (FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr);) {
while (true) {
// 一次讀一行
String line = br.readLine();
if (null == line)
break;
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
# 使用緩存流寫出數據
PrintWriter 緩存字符輸出流, 可以一次寫出一行數據
```
package com.dodoke.util;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
public class TestSteam9 {
public static void main(String[] args) {
// 向文件lol2.txt中寫入三行語句
File f = new File("d:/log2.txt");
try ( // 創建文件字符流
FileWriter fw = new FileWriter(f);
// 緩存流必須建立在一個存在的流的基礎上
PrintWriter pw = new PrintWriter(fw);) {
pw.println("garen kill teemo");
pw.println("teemo revive after 1 minutes");
pw.println("teemo try to garen, but killed again");
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
# flush
有的時候,需要**立即把數據寫入到硬盤**,而不是等緩存滿了才寫出去。 這時候就需要用到flush。
```
package com.dodoke.util;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
public class TestSteam10 {
public static void main(String[] args) {
// 向文件lol2.txt中寫入三行語句
File f = new File("d:/log2.txt");
try ( // 創建文件字符流
FileWriter fw = new FileWriter(f);
// 緩存流必須建立在一個存在的流的基礎上
PrintWriter pw = new PrintWriter(fw);) {
pw.println("garen kill teemo");
// 強制把緩存中的數據寫入硬盤,無論緩存是否已滿
pw.flush();
pw.println("teemo revive after 1 minutes");
pw.flush();
pw.println("teemo try to garen, but killed again");
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```