Java 緩存流BufferedReader,PrintWriter
以媒體是硬碟為例,位元組流和字元流的弊端:
在每一次讀寫的時候,都會通路硬碟。 如果讀寫的頻率比較高的時候,其性能表現不佳。
為了解決以上弊端,采用緩存流。
緩存流在讀取的時候,會一次性讀較多的資料到緩存中,以後每一次的讀取,都是在緩存中通路,直到緩存中的資料讀取完畢,再到硬碟中讀取。
就好比吃飯,不用緩存就是每吃一口都到鍋裡去鏟。用緩存就是先把飯盛到碗裡,碗裡的吃完了,再到鍋裡去鏟
緩存流在寫入資料的時候,會先把資料寫入到緩存區,直到緩存區達到一定的量,才把這些資料,一起寫入到硬碟中去。按照這種操作模式,就不會像位元組流,字元流那樣每寫一個位元組都通路硬碟,進而減少了IO操作
示例 1 : 使用緩存流讀取資料
緩存字元輸入流 BufferedReader 可以一次讀取一行資料
package stream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestStream {
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:/lol.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 (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
示例 2 : 使用緩存流寫出資料
PrintWriter 緩存字元輸出流, 可以一次寫出一行資料
package stream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class TestStream {
public static void main(String[] args) {
// 向檔案lol2.txt中寫入三行語句
File f = new File("d:/lol2.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 (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
示例 3 : flush
有的時候,需要立即把資料寫入到硬碟,而不是等緩存滿了才寫出去。 這時候就需要用到flush
package stream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class TestStream {
public static void main(String[] args) {
//向檔案lol2.txt中寫入三行語句
File f =new File("d:/lol2.txt");
//建立檔案字元流
//緩存流必須建立在一個存在的流的基礎上
try(FileWriter fr = new FileWriter(f);PrintWriter pw = new PrintWriter(fr);) {
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 (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
練習: 移除注釋
設計一個方法,用于移除Java檔案中的注釋
比如,移出以//開頭的注釋行
File f = new File("d:/LOLFolder/LOL.exe");
System.out.println("目前檔案是:" +f);
//檔案是否存在
System.out.println("判斷是否存在:"+f.exists());
//是否是檔案夾
System.out.println("判斷是否是檔案夾:"+f.isDirectory());
注: 如果注釋在後面,或者是風格的注釋,暫不用處理
答案 :
package stream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class TestStream {
public static void removeComments(File javaFile) {
StringBuffer sb = new StringBuffer();
//讀取内容
try (FileReader fr = new FileReader(javaFile); BufferedReader br = new BufferedReader(fr);) {
while (true) {
String line = br.readLine();
if (null == line)
break;
//如果不是以//開頭,就儲存在StringBuffer中
if (!line.trim().startsWith("//"))
sb.append(line).append("\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}
try (
FileWriter fw = new FileWriter(javaFile);
PrintWriter pw = new PrintWriter(fw);
) {
//寫出内容
pw.write(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
File javaFile = new File("E:\\project\\j2se\\src\\character\\MyStringBuffer2.java");
System.out.println(javaFile.exists());
System.out.println(javaFile.length());
removeComments(javaFile);
}
}