目录
缓冲区的出现是为了提高流的操作效率(对数据的读写效率)而出现的。所以在创建缓冲区之前,必须要先有流对象。
缓冲区对应类:
BufferedWriter/BufferedReader
BufferedInputStream/BufferedOutputStream
BufferedWriter
字符写入流缓冲区
在流的基础上对流的功能进行了增强,缓冲区中提供了一个跨平台的换行符:
void newLine():写入一个行分隔符。
class BufferedWriterDemo{
public static void main(String[] args)throws IOException{
// 创建一个字符写入流对象
FileWriter fw=new FileWriter("buf.txt");
// 为了提高字符写入流效率,加入缓冲技术。
// 只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw=new BufferedWriter(fw);
for(int x=1;x<5;x++){
bufw.write("abcd"+x);
bufw.newLine(); // 行分隔符
bufw.flush(); // 刷新缓冲区
}
// 记住,只要用到缓冲区,就要记得刷新。
// bufw.flush();
// 其实关闭缓冲区,就是在关闭缓冲区中的流对象。
bufw.close();
}
}
BufferedReader
该缓冲区提供了一个一次读一行的方法,方便对文本数据的获取:
String readLine():读取一个文本行。返回值:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。
class BufferedReaderDemo{
public static void main(String[] args)throws IOException{
// 创建一个读取流对象和文件相关联
FileReader fr=new FileReader("buf.txt");
// 为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象的构造函数。
BufferedReader bufr=new BufferedReader(fr);
String line=null;
while((line=bufr.readLine())!=null){
System.out.println(line);
}
bufr.close(); // 关闭流资源
}
}
注意:
readLine()方法返回的时候只返回回车符之前的数据内容,并不返回回车符,所以一般要自己添加换行符。
缓冲区复制.java文件
/*
通过缓冲区复制一个.java文件。
*/
import java.io.*;
class CopyTextByBuf{
public static void main(String[] args)throws IOException{
BufferedReader bufr=null;
BufferedWriter bufw=null;
try{
bufr=new BufferedReader(new FileReader("BufferedWriterDemo.java"));
bufw=new BufferedWriter(new FileWriter("bufWriter_copy.txt"));
String line=null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine(); // 因为readLine()并不会返回回车符,所以要自己添加一个换行符
bufw.flush();
}
}catch(IOException ex){
throw new RuntimeException("读写失败!");
}finally{
try{
if(bufr!=null)
bufr.close();
}catch(IOException ex){
throw new RuntimeException("读取关闭失败");
}
try{
if(bufw!=null)
bufw.close();
}catch(IOException ex){
throw new RuntimeException("写入关闭失败!");
}
}
}
}
仿写BufferedReader类
readLine()方法的原理:
无论是读一行,或者读取多个字符。其实最终都是在硬盘上一个一个读取,所以最终使用的还是read()方法一次读一个的方法。
import java.io.*;
class MyBufferedReader{
// 构造函数
private FileReader r;
MyBufferedReader(FileReader r){
this.r=r;
}
// 仿readLine()
public String myReadLine()throws IOException{
// 定义一个临时容器。原BufferedReader封装的是字符组。
// 为了演示方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串。
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
// 仿close()
public void myClose()throws IOException{
r.close();
}
}
class MyBufferedReaderDemo{
public static void main(String[] args)throws IOException{
FileReader fr=new FileReader("buf.txt");
MyBufferedReader myBufr=new MyBufferedReader(fr);
String line =null;
while((line=myBufr.myReadLine())!=null){
System.out.println(line);
}
myBufr.myClose();
}
}