黑马程序员技术交流社区
标题:
关于IO缓冲区的问题
[打印本页]
作者:
肖琦
时间:
2012-7-27 08:29
标题:
关于IO缓冲区的问题
FileWriter fw = new FileWriter("test.txt");
for (int i = 0; i < 10*1024; i++) {
fw.write('a');
}
Thread.sleep(20000);
/*
* 趁线程睡觉的20秒钟时间,我到文件夹打开test.txt一看,已经有8192字节的数据了,此时fw还没有close.
* 这是否说明FileWriter类的内部已经有一个8129字节的缓冲区?
* 如果是这样,那么使用缓冲区大小小于8k的BufferedWriter还有意义吗?
*/
fw.close();
/*
*而且,在毕老师的视频里,我见到如下的代码片段:(出于简便,没有做异常处理)
*/
BufferedReader bufr = new BufferedReader(new FileReader("a.txt)"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();//每新增一行就刷掉缓冲区,这样是否有违缓冲区的初衷?
}
复制代码
作者:
柳雷
时间:
2012-7-27 08:56
对于第一个问题,我做了一个测试
public class Liu {
public static void main(String[] args){
FileWriter fw=null;
//FileReader fr;
try{
fw=new FileWriter("D://a.txt");
for(int i=0;i<100000;i++)
fw.write('a');
}
catch(IOException e){
}
}
}
复制代码
运行程序后,文件创建了,而且文件中有了内容,我们可以断定,在这个缓冲区满了之后。不用调用flush方法,java会自动将保存在缓冲区的内容写入到磁盘上。
之后又编了一个取得字符个数程序:
写入10万个a, 最后保存起来的是98304个a, 在反复多次试验中,我发现了当我写入8193个字符时,文件中最后会保存8192个字符,而当写入的字符小于8192时,文件中不会有任何东西。所以java中提供的缓冲区大小应该为8KB。
经过实验我们可以看出:无论使不使用BufferedWriter,当向文件中写入数据时,数据流始终先保存到一段缓冲区中,当写入的数据流大于8KB(使用BufferedWriter包装后是16K)而没有进行刷新流操作时,JAVA会自动刷新流,将流写入到文件中。
对于问题二:每新增一行就刷掉缓冲区
这是因为如果数据写入中间发生异常,停留在缓冲区的数据将会丢失。
作者:
胡文凡
时间:
2012-7-27 09:13
BufferedReader bufr = new BufferedReader(new FileReader("a.txt)"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();//每新增一行就刷掉缓冲区,这样是否有违缓冲区的初衷?
作者:
胡文凡
时间:
2012-7-27 09:16
BufferedReader bufr = new BufferedReader(new FileReader("a.txt)"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
//将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();//每新增一行就刷掉缓冲区,这样是否有违缓冲区的初衷?
实际上创建的时候可以指定其大小
BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
一般情况下默认的就可以,如果太小在调用readLine()是自动增长,但是这个增加是需要额外的花费的。如果频繁增加更加影响效率。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2