欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java的输入/输出——缓冲流

程序员文章站 2022-04-03 19:35:41
...

缓冲流

缓冲区:
计算机访问外部设备或文件,要比直接访问内存慢的多。如果我们每次调用read()方法或者writer()方法访问外部的设备或文件,CPU就要花上最多的时间是在等外部设备响应,而不是数据处理。
为此,我们开辟一个内存缓冲区的内存区域,程序每次调用read()方法或writer()方法都是读写在这个缓冲区中。当这个缓冲区被装满后,系统才将这个缓冲区的内容一次集中写到外部设备或读取进来给CPU。使用缓冲区可以有效的提高CPU的使用率,能提高整个计算机系统的效率。在字符流操作中,所有的字符都是在内存中形成的,在字符流输出前都将保存在内存中的缓冲区内。
缓冲流:
再读写数据时,让数据在缓缓冲区能减少系统实际对原始数据来源的存取次数,因为一次能做多个数据单位的操作,相较而言,对于从文件读取数据或将数据写入文件,比起缓冲区的读写要慢多了。所以使用缓冲区的 流,一般都会比没有缓冲区的流效率更高,拥有缓冲区的流别称为缓冲流,包括BufferedInputStream、BufferedOutputStream类和BufferedReader、BufferedWriter类。缓冲流把数据从原始流成块读入或把数据积累到一个大数据块后再成批写出,通过减少通过资源的读写次数来加快程序的执行

BufferedReader类

BufferedReader是Reader的子类。Reader类的read()方法每次都从数据源读入一个字符(两个字节),为了提高效率,可以采用BufferedReader来配合其他字节流。BufferedReader带有缓冲区,它可以先把一批数据读入到缓冲区内。接下来的读操作都是从缓冲区获取数据,避免每次都从数据源读取数据并进行字符编码转换,从而提高操作效率。
Java的输入/输出——缓冲流

BufferedWriterr类

BufferedWriter类是Writer的子类。与Writer相比,BufferedWriter类主要改变是重写了flush()方法,该方法可以确保缓冲区里的数据确实被写到输出流中,使用BufferedWriter类时,写入的数据并不会先输出到目的地,而是先存储至缓冲区。BufferedWriter流提供了缓冲区,能更有效的写出字符流数据:
Java的输入/输出——缓冲流

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * 缓冲流
 * 
 * @author lzq
 *
 */
public class TestDemo4 {

    public static void main(String[] args) {
        File file = new File("D:\\lzq/java.txt");
        verify(file);
        print(file);
        verify1(file);

    }

    /**
     * 验证缓冲流——BufferedReader
     * @param file
     */
    private static void verify(File file) {
        String str = "";
        try {
            Reader read = new FileReader(file);
            BufferedReader bin = new BufferedReader(read);
            str = bin.readLine();   //读取文件内容存入char数组
            bin.close();
            read.close();

        }catch(IOException e) {
            System.out.println("读取失败");
            e.printStackTrace();
        }
        System.out.println(str);
    }

    /**
     * BufferedReader类还可以接收来自键盘输入的字节流,但需要InputStreamReader将
     * 键盘的字节流System.in转化为字符流
     * 天才是99%汗水+1%灵感
     * @param file
     */
    private static void print(File file) {
        String str = "";
        try {
            BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入内容:");
            str = bin.readLine();   //读取内容存入数组
            bin.close();
        }catch(IOException e) {
            System.out.println("读取失败");
            e.printStackTrace();
        }
        System.out.println(str);
    }

    /**
     * 验证缓冲流——BufferedWriter
     * @param file
     */
    private static void verify1(File file) {
        String[] str = {"锲而舍之","朽木不折","锲而不舍","金石可镂"};
        try {
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            for(int i = 0;i < str.length;i++) {
                bw.write(str[i]);
                bw.newLine();   //达到换行的目的
            }
            bw.close();
            fw.close();
            System.out.println("写入成功");
        }catch(IOException e) {
            System.out.println("写入失败");
            e.printStackTrace();
        }

    }
}

运行结果:
Java的输入/输出——缓冲流

Java的输入/输出——缓冲流