------- android培训、java培训、期待与您交流! ----------
BufferedReader类和BufferedWriter类,可以想象成套在字符流通道外面的更多的一个通道,为原始字符流提供缓冲区功能,提高读写效率。而且,比原始的字符流增加了读写整行的功能。
BufferedReader类的readLine()方法,在类内部添加了缓冲数组,调用原始字符输入流的read()方法,一次读取一个字符并存入缓冲区。通过一次读取一行,加快了效率。基于这样的远离,我们可以模拟写出自己的带有缓冲功能的字符输入流。
import java.io.*;
public class MyBufferedReaderDemo {
public static void main(String[] args) throws Exception {
MyBufferedReader r = new MyBufferedReader(new FileReader("d:\\MyBufferedReaderDemo.java"));
String s = null;
while((s=r.readLine()) != null) {
System.out.println(s);
}
r.close();
}
}
class MyBufferedReader {
//需要添加缓冲区的原始流对象
private Reader reader;
//设置缓冲区默认大小
private int bufLength = 20;
//缓冲区数组
private int[] buf = new int[bufLength];
public MyBufferedReader(FileReader fr) {
this.reader = fr;
}
public String readLine() throws IOException {
//返回最终结果
String result = "";
//数组缓冲区的指针
int i = 0;
//暂存读进来的单个字符
int ch = 0;
while((ch=reader.read()) != -1) {
//如果当前字符是回车符说明已读到一行结尾,则跳过循环,读下一个换行符
if(ch == '\r')
continue;
//如果读到换行符,则返回整行组成的字符串
if(ch == '\n') {
result += new String(buf, 0, i);
return result;
}
buf[i++] = ch;
//如果缓冲区已满,则转换成字符串进行累加,同时指针归0
if(i==bufLength) {
result += new String(buf, 0, bufLength);
i = 0;
}
}
//退出while循环,说明已经读到了文件末尾,如果此时缓冲区还有数据的话,则整合到一起
if(i > 0) {
result += new String(buf, 0, i);
}
//这里判断如果readLine已经读到末尾还继续读的话,则返回null
if(result=="") return null;
//返回最终结果
return result;
}
public void close() throws IOException {
this.reader.close();
}
}
BufferedWriter类新增了newLine()方法,可以写一个换行符,这个换行符可以跨平台(在Windows中是回车符+换行符,在Linux中只是换行符)。
下面使用带有缓冲区的BufferedReader和BufferedWriter重新编写复制文件的代码:
import java.io.*;
public class BufferedCopy {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\test.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\test_copy.txt"));
String s = null;
while((s=br.readLine()) != null) {
bw.write(s);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}