天天看點

Java自學-I/O 緩存流

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);
    }
}