java IO 字符流(三)BufferedReader与BufferedWriter
BufferedReader与BufferedWriter分别继承自Reader与Writer,也是这两者的装饰者,具体的可以了解一下装饰者模式(在不改变被装饰者的情况下,动态的给被装饰者添加职责),两者主要的作用就是通过使用缓冲区提高对文本操作的效率。
一、BufferedReader
通过查看源码可以发现其构造方法有两种,其实可以理解成一种(都是要设置缓冲区大小的,一个用默认的,一个用自定义的)
当然从源码中还可以了解到,其缓冲区默认大小为8192,而默认的读取一行的最大长度为80,这个可能面试的时候会问到吧。
通过查看源码可以大概发现其读取流程:
当BufferedReader读取文本时会将字符先读取到缓冲区中,而后调用read方法时都是从缓冲区中读取的,如果缓冲区读完了,且文本中还有数据,则再去文本中将字符读取到缓冲区中。这个可以自己断点一下,能看到(可以手动将缓冲区大小设置为3或者其他小一点的数据)。
从上面可以看到如果满足条件返会的cb中的字符,其中fill方法的代码如下:
原理其实不难,作用也是显而易见的,就是为了提高读取效率。使用的设计模式就是装饰者模式。具体的可以自己设置断点看一下,很简单。
public class BufferedReaderTest {
/**
* @param args
*/
public static void main(String[] args) {
FileReader reader = null;
try {
reader = new FileReader("D:\\test.txt");
/*为了方便看到效果,设置缓冲区大小为3个字符*/
BufferedReader bfd = new BufferedReader(reader,3);
String str = "";
while((str=bfd.readLine())!=null){
System.out.println(str);
}
bfd.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
可能其中比较值得注意的就是readLine长度是有限制的。
二、BufferedWriter
与BufferedReader类似,其构造方法有两种,如下:
同样可以设置缓冲区大小,也可以使用默认的缓冲区,默认值8192,为什么是这个数值,同样表示不理解。
同样BufferedWriter是为了提高输出效率的,每次将字符放入缓冲区,然后统一输出,提高效率
public class BufferedWriterTest {
/**
* @param args
*/
public static void main(String[] args) {
FileWriter writer = null;
try {
writer = new FileWriter("D:\\writer.txt");
BufferedWriter bfw = new BufferedWriter(writer,2);
bfw.write("我是一个测试的句子!");
bfw.flush();
bfw.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
BufferedReader与BufferedWriter没有想象的那么难理解,源码也不是很难,主要作用就是提高效率,使用的时候尽量使用BufferedReader与BufferedWriter。项目中用到的一般比较少,面试的时候可能会多一点吧。
推荐阅读
-
java IO 字符流(三)BufferedReader与BufferedWriter
-
java基础回顾之 流(BufferedReader/BufferedWriter )字符缓冲流, 默认有8192个字符的缓冲区
-
Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
-
字符缓冲输出流BufferedWriter与字符缓冲输入流BufferedReader:
-
javaSE25-- IO流--字符缓冲流BufferedReader/BufferedWriter
-
java IO流三:字符流 FileReader & FileWriter
-
Java - io框架[字符流](三)
-
Java IO流之节点流与字符流的相关知识总结
-
缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter
-
JAVA-----IO篇四(缓冲流BufferedWriter以及BufferedReader、转换流outputStreamWriter以及inputStreamWriter)