字符流缓冲区:BufferedWriter,BufferedReader

来源:互联网 发布:vmware for mac破解版 编辑:程序博客网 时间:2024/05/16 17:36

BufferedWriter:

类继承关系:
java.lang.Object
  java.io.Writer
      java.io.BufferedWriter

该类的构造方法:
 BufferedWriter(Writer out);
 创建一个使用默认大小输出缓冲区的缓冲字符输出流;
BufferedWrite(Write out, int sz);
 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

字符流写入时候,可以采取直接写入的方式:
首先创建一个字符流对象:

FileWriter fw = new FileWriter("C:\\Demo\\test.txt");

然后对该对象进行写操作:

fw.write("ydhts");//直接写入fw.close();//关闭流对象

这样就能直接把以上数据直接写入到目标文件中去。
以上操作中,如果想对写入的数据进行换行,可以这样处理:

fw.write("ydhaksd\n\rjkaflts");

或者:

private static final String Line_SEPARATOR = System.getProperty("line.separator");fw.write("asadfgh"+Line_SEPARATOR+"SDFFGG");

以上方法就完成了对流对象中文件的写操作。

但是使用上边的方法将数据写入目的地效率较低,可以使用缓冲区:
先将数据存入缓冲区,再将数据写入目的地:

//创建流对象FileWriter fw = new FileWriter("C:\\src\\test.txt");//为了提高写入效率,可以使用字符流的缓冲区。//创建一个字符写入流的缓冲区对象,并和制定要被缓冲的流对象相关联。BufferedWriter bw = new BufferedWriter(fw);//使用缓冲区的写入方法,将字符写入到缓冲区。bw.write("ydhts");bw.newLine();//将写入的数据进行换行bw.write("ADEJKGHJGFY");//使用缓冲区的刷新方法将数据写入目的文件。bw.flush();//关闭缓冲区。bw.close();

以上方法可以实现对流对象数据的写入操作。

通过代码可以看到,操作完成后并没有关闭FileWriter的fw对象,但是再次使用该对象对数据进行写入时却提示该对象不存在。

这是因为,缓冲区操作的数据就是该流对象的数据,关闭缓冲区的同时将流对象也关闭了,所以会提示该流对象不存在。


BufferedReader:
类继承关系:
java.lang.Object
  java.io.Writer
      java.io.BufferedReader
该类具有的构造函数:
BufferedReader(Reader in);
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz);
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
字符流读取时候,可以采取直接读取的方式:

//创建字符流对象:FileReader fr = new FileReader("C:\\Demo\\test.txt");然后使用该对象进行字符数据的读取://申请缓冲区,一次性读取1024个字符char[] buf = char[1024];int num = 0;//判断,直到读取完毕。while((num = fr.read(buf) != -1)){System.out.println(new String(buf, 0, num));}//关闭流对象。fr.close();

使用以上的方法可以实现对文件的读写,但是这种方法的读写效率太低。
下面使用读取流的缓冲区读取源文件中的数据:

//声明一个读取流对象FileReader fr = new FileReader("C:\\src\\test.txt");//声明一个读取缓冲区的对象,并与读取流对象相关联BufferedReader br = new BufferedReader(fr);

按行读取:

String line1 = br.readLine();System.out.println(line1);String line2 = br.readLine();System.out.println(line2);String line3 = br.readLine();System.out.println(line3);String line4 = br.readLine();System.out.println(line4);String line5 = br.readLine();System.out.println(line5);String line6 = br.readLine();System.out.println(line6);

但是以上按行读取方法有一个弊端:
就是如果不知道文档中的数据有多少行时,读取到的数据要么不完整,要么超出数据行数,返回null。
如上面的代码,运行之后,输出数据的同时,最后一个输出语句返回null。

所以可以这样:设置一个判断语句,当读取到的文档的末尾时停止读取

//声明一个读取流对象FileReader fr = new FileReader("C:\\src\\test.txt");//声明一个读取缓冲区的对象,并与读取流对象相关联BufferedReader br = new BufferedReader(fr);char[] buf = new char[1024];int len = 0;while((len = br.read(buf)) != -1){System.out.println(new String(buf, 0, len));}br.close();

或者:设置如果读取数据为null,停止读取:

String line = null;while((line = br.readLine()) != null){System.out.println(line);}

这样就能完整地读取到源数据文件中的所有字符了。

原创粉丝点击