字符流-缓冲区

 

在进行文件复制方式二的时候用到了缓冲区,char[] buf = new char[1024];这个就是缓冲区,这个缓冲区是我们自己创建的,使用缓冲区可以提高效率。因为缓冲区可以提高效率,所以Java把缓冲的功能封装起来,称为一个对象。其实缓冲区里面就是封装了一个数组,用来对流所操作的数据进行缓存。缓冲区的出现提高了对数据的读写效率。两个字符流缓冲对象BufferedWriter、BufferedReader。

1.    BufferedWriter 

BufferedWriter“将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 ”“可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。”我们来看它的构造方法,缓冲区是用来提高读写效率的,所以,缓冲区需要处理数据,那么数据是从哪来的?是从输出流对象中读取到的,所以需要传入输出流对象。它的方法有关闭、flush、写出write,还多了一个进行换行的方法newLine() 。

在数据不是很多的情况下,我们可以这么写,把异常抛出去,这样看代码会比较方便些:

package com.java.base;

import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo {
	public static void main(String[] args) throws IOException {
		FileWriter fw = new FileWriter("test.txt");
		fw.write("abcdefg");
		fw.close();
	}
}

这么写是OK的。现在,为了提高写出的效率,可以使用字符缓冲区,字符缓冲区不是必须要使用的,是根据你的需要才进行使用。通过分析,它确实可以提高效率。

1.创建了一个字符输出流的缓冲区对象,并和指定要被缓冲的流对象相关联。

2.使用缓冲区的写出方法将数据先写到缓冲区中。

3.关闭缓冲区

4.运行,结果OK。

5.关闭了缓冲区还要不要关闭输出流呢?我们来看一下,在字符缓冲区关闭之后,我们使用文件字符输出流写数据

6.这时候,运行报错Exception in thread "main" java.io.IOException: Stream closed。也就是说缓冲区在关闭的时候会把流对象关闭。所以不用再进行关闭输出流的操作。

7.代码

package com.java.base;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo {
    public static void main(String[] args) throws IOException {
           FileWriter fw = new FileWriter("test.txt");
           BufferedWriter bw = new BufferedWriter(fw);
           bw.write("abcdefg1");
           bw.close();
           //fw.write("safd");//Exception in thread "main" java.io.IOException: Stream closed
    }
}

缓冲区仅仅是用来提高读写效率的,它不操作底层,也就是说它不操作文件夹,操作文件的是文件字符输出流。

8.BufferedWriter 提供了一个进行换行的方法,这个方法是newLine();

bw.write("abcdefg1");

              bw.newLine();

       bw.write("asdfalsdkf");

9.在文件中多写几行:

for(int x=1; x<=4; x++){

                     bw.write("abcdefg"+x);

                     bw.newLine();

                     bw.flush();//最好加上flush,防止程序出问题时数据丢失

              }

2.    BufferedReader 

在文件中写了数据,现在就来读取写出的数据是什么。

package com.java.base;

import java.io.FileReader;
import java.io.IOException;

public class BufferedWriterDemo {
	public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("test.txt");
        char[] chs = new char[1024];
        int len = 0;
        while((len = fr.read(chs)) != -1){
               System.out.println(new String(chs,0,len));
        }
        fr.close();
    }
}

BufferedReader“从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 ”BufferedReader有一个方法,这个方法可以读取一行的数据。把上面的代码封装到一个方法里,另外写使用缓冲区的代码,

package com.java.base;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedWriterDemo {
	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("test.txt");
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        while((line = br.readLine()) != null){
               System.out.println(line);
        }
    }
}

字符流缓冲区:

BufferedWriter 有一个特有方法newLine();这个方法是用来换行的。      

BufferedReader也有一个特殊的方法,是用来读取一行的数据readLine();

两个方法是对应的。

 

3.    复制文本文件 

package com.java.base;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo {
	public static void main(String[] args) throws IOException {
           FileReader fr = new FileReader("buf.txt");          
           BufferedReader br = new BufferedReader(fr);
           FileWriter fw = new FileWriter("buf_copy.txt");
           BufferedWriter bw = new BufferedWriter(fw);
           String line = null;
           while((line=br.readLine())!=null){
                  bw.write(line);
                  bw.newLine();
                  bw.flush();
           }
           bw.close();
           br.close();
    }
}

猜你喜欢

转载自blog.csdn.net/pigziprogrammer/article/details/95190580
今日推荐