java IO 二(字符流缓冲区)

上一篇内容java IO 一 (读写字符串)

使用BufferedReader和BufferedWriter实现一个文本文件的复制

private static void copy() {

        BufferedReader bfr=null;
        BufferedWriter bfw=null;
        try {
             bfr=new BufferedReader(new FileReader("D:/FileReadDemo.java"));
             bfw=new BufferedWriter(new FileWriter("D:/FileReadDemo_Copy.java"));
             String line=null;
             while((line=bfr.readLine())!=null){
                 bfw.write(line);
                 bfw.newLine();
                 bfw.flush();
             }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{

            if(bfw!=null){
                try {
                    bfw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bfr!=null){
                try {
                    bfr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

下面看看比较重要的代码

bfr=new BufferedReader(new FileReader("D:/FileReadDemo.java"));

JAVA中关于BufferedReader的相关描述。

从一个字符数如流中读入文本信息,提供字符缓存来提高读取字符、字符数组或者一行字符的效率。你可以指定缓冲区的大小,如果不指定,就是用默认的大小。一般我们不需要去指定,使用默认的即可。通常情况下,一个“Reader”的读取操作会是顶层的字符或者字节流产生一个相应的读取请求。因此,建议用BufferedReader把一些“Reader包裹起来”,比如“FlieReader和InputStreamReader”–因为这些Reader的读取效率不高。如下所示:

BufferedReader in= new BufferedReader(new FileReader("foo.in"));

会缓冲指定文件中的输入流。如果不进行缓冲操作,那么每次调用read()方法或者readlLine()方法会从文件中读取一个字节,转化成字符然后返回,这样效率很低。

使用DataInputStreams 来输入文本信息的程序也可以使用相应的BufferedReader来替代每个DataInputStream。

BufferedReader的构造函数

//使用默认缓冲区大小来实例化一个字符缓冲输入流
BufferedReader(Reader in) 

////使用指定缓冲区大小sz(sz应该是2的幂的形式,比如512,1024,2048等等)来实例化一个字符缓冲输入流
BufferedReader(Reader in, int sz) 

//读入一行字符,但不包括这一行的终止字符(回车'\r',换行'\n')这个方法比较方便。
String readLine() 

所以我们在读完一行,向外写的时候这这样的:

 //写出一行字符串
 bfw.write(line);
 //换行
 bfw.newLine();

接下来简要说一下,这个BufferedRead实现缓冲的原理。我们查看BufferedRead的源码。里面定义了两个成员变量(还有其他很多的成员变量,没有列出来。)

private char cb[];//用来缓冲的字符数组
private static int defaultCharBufferSize = 8192;//用来缓冲的字符数组的默认的大小

原理:当BufferedRead读取的时候比如说调用readLine()方法,最终调用的还是read()方法,每次读取一个字符。但是每次读到一个字符的时候并没有直接返回(从外存返回到内存中),而是把这个独到的字符放进了BufferedRead的cb[]数组中,当读到一行的末尾的位置的时候,就把这个字符数组cb[]转换成一个字符串返回(一次性从外存返回一个字符串,减少了内存和外存交互的次数),这样就提高了读取的效率,仅此而已。

JAVA JDK 关于BufferedWriter的解释
向字符数处流中写文本信息,提供字符缓存,以提高写单个字符、字符数组、字符串的效率。缓冲区大小可以指定,也可以使用默认的,通常我们使用默认的就够了。默认缓冲区大小是8192个字节。newLine()方法使用系统自带的换行符进行换行。如果你在写完一行数据后想在新的一行写数据,可以调用这个方法。通常情况下,一个Writer会立即向底层的字符或者字节输出流发送要写出的数据。除非是要求立即输出,建议使用BufferedWriter来包裹任何Writer,例如FileWriter和OutputStreaemWriter—-因为这些Writer的效率不高

 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

会缓冲PrintWriter到文件中的输出。如果没有缓冲的话,每次调用print()方法就会把一个字符转化为字节并立即写到文件中,效率不高。

BufferedWriter实现缓冲输出的原理和BufferedRead的原理类似。我们打开BufferedWriter的源码,发现在其内部也有两个变量和BufferedReader中的一样。

private char cb[];
 private static int defaultCharBufferSize = 8192;

BufferedWriter的原理(可能不太准确):当进行写操作的时候使用Write(String string)(内存向外存写),BufferedWriter会先把读取到的字符存储在cb[]中,然后调用flush()方法,一次性将这个字符数组写到外存。(减少内存和外存的交互次数,提高了写的效率)

最近这几天老是腰疼,艰难啊。身体还是第一位的,没有身体,其他都是扯淡。注意休息,保重身体。

你可能感兴趣的:(java,字符流)