------- android培训、java培训、期待与您交流! ----------
缓冲区的出现提高了对数据的读写效率 对应类 BufferedWriter ,BufferedReader,
缓冲区要结合流才能使用
在流的基础之上对流的功能进行了增强
BufferedWriter类将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入,可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
构造方法:BufferedWriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流
BufferedWriter(Writer out, int sz)创建一个使用指定大小输出缓冲区的新缓冲字符输出流
在创建缓冲区对象时候要传入流对象,因为缓冲区就是为流服务的。
BufferedWriter类有一个写入单个字符方法write(int c) ,有写入字符串的某一部分的方法write(String s, int off, int len),有写入字符数组的某一部分的方法write(char[] cbuf, int off, int len)。写入缓冲区的之后要使用flush()方法,刷新流的缓冲,才能将内容分类写入文件。
如果要在一个写文件的程序中写入一个换行符,BufferedWriter类提供了一个跨平台功能的方法newLine()写入一个行分隔符,因为在不同的系统环境识别的换行符不一样,例如在windows平台下识别的是"\r\n",而在Linux环境下识别的是"\n",为了克服这个差异,Java提供了newLine()方法。
在程序结束的时候要关闭缓冲区,使用close()方法,但这个方法的实际功能也是在关闭流对象,所有就不用再写关闭FileWriter流对象的close()方法
BufferedReader类从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
构造方法:BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流,
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
同样在创建缓冲区对象的时候也要传入文件读取流对象。
同样有读取单个字符的方法read(),将字符读入数组的某一部分的方法read(char[] cbuf, int off, int len) ,其中参数cbuf
- 目标缓冲区,off
- 开始存储字符处的偏移量,len
- 要读取的最大字符数 。高效率的读取方法是读取一行,readLine(),通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行,也是跨平台的。一个模拟内部功能的方法如下:
public String myReadLine() throws IOException{
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch = r.read())!=-1){ //r是文件读取流对象
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
其实readLine()方法还是使用了底层的read()方法,使用了设计模式中的装饰设计模式。
下面是一个复制文件的程序实例:
import java.io.*;
class CopyByBufTest{
public static void main(String args[]){
BufferedReader bufr = null;
BufferedWriter bufw = null;
try{
bufr = new BufferedReader(new FileReader("CopyByBufTest.java"));
bufw = new BufferedWriter(new FileWriter("CopyByBufTest_Copy.txt"));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.flush();
}
}catch(IOException e){
throw new RutimeException("读写失败");
}finally{
try{
if(bufr!=null)
bufr.close();
}catch(IOException e){
throw new RutimeException("读取关闭失败");
}finally{
try{
if(bufw!=null)
bufw.close();
}catch(IOException e){
throw new RutimeException("写入关闭失败");
}
}
}
}
}