字符流缓冲区:BufferedWriter,BufferedReader

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);
}

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值