Java IO 缓存流


字节流和字符流每次读写都会访问硬盘,当读写频率增加其访问效率不高
而使用缓存流读取时会将大量数据先读取到缓存中,以后每次读取先访问缓存,直到缓存读取完毕再到硬盘读取,缓存流写入数据也是一样,先将数据写入到缓存区,直到缓存区达到一定的量,才把这些数据一起写道硬盘中去,这样减少了IO操作。


使用缓存流读数据

缓存字符输入流 BufferedReader 可以一次读取一行数据

package JavaIOTest;


import java.io.*;

public class BufferedIoTest {
    public static void main(String[] args) {
        File file = new File("d:/xyz/z/zzz/zzzz/textFile.txt");
        //创建基于文件对象的字符流
        //缓存流必须建立在一个存在的流的基础上
        try(
                FileReader fileReader = new FileReader(file);
                BufferedReader bufferedReader = new BufferedReader(fileReader);
                )
        {
            while(true){
                String line = bufferedReader.readLine();
                if (null == line)
                    break;
                System.out.println(linea);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

使用缓存流写数据

PrintWriter 缓存字符输出流, 可以一次写出一行数据

package JavaIOTest;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterTest {
    public static void main(String[] args) {
        File file = new File("d:/xyz/z/zzz/zzzz/textFile.txt");
        try(
                FileWriter fileWriter = new FileWriter(file);
                PrintWriter printWriter = new PrintWriter(fileWriter);
                )
        {
            printWriter.println("清华大学");
            printWriter.println("北京大学");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

flush

有的时候,需要立即把数据写入到硬盘,而不是等缓存满了才写出去。 这时候就需要用到flush

package JavaIOTest;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterTest {
    public static void main(String[] args) {
        File file = new File("d:/xyz/z/zzz/zzzz/textFile.txt");
        try(
                FileWriter fileWriter = new FileWriter(file);
                PrintWriter printWriter = new PrintWriter(fileWriter);
                )
        {
            printWriter.println("清华大学");
            printWriter.flush();
            printWriter.println("北京大学");
            printWriter.flush();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

练习:移除“//”形式的注释

package JavaIOTest;

import java.io.*;

public class RemoveNotesTest {
    public static void main(String[] args) throws IOException {
        File file = new File("d:/xyz/z/zzz/zzzz/notes.class");
        removeNotes(file);
    }
    public static void removeNotes(File file) throws IOException{
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        StringBuilder stringBuilder = new StringBuilder();
        while (true){
            String line = bufferedReader.readLine();
            if(null == line){
                break;
            }
            else if (!line.trim().startsWith("//")){
                stringBuilder.append(line);
                stringBuilder.append("\n");
            }
        }
        FileWriter fileWriter = new FileWriter(file);
        fileWriter.write(stringBuilder.toString());
        fileWriter.close();
        bufferedReader.close();
        fileReader.close();
    }
}
posted @ 2019-07-30 15:06  消灭猕猴桃  阅读(103)  评论(0编辑  收藏  举报