先写原因:注意bWriter.flush(),bWriter.close(),bReader.readline()三条语句的顺序。先flush,close,再readline()没问题.
今天写一个用BufferedWriter写txt文件,BufferedReader读txt文件的程序时,运行后,发现txt文件里的内容跟原始的相比,缺失了一大部分,经过一番测试,debug后,还是没能解决问题,简直我勒个去。
根据我写的代码分析
1.一开始查找是不是BufferedReader中的readline()的阻塞问题
被readLine()折腾了一把
还去原文件看了是不是遇到/r或/n或/r/n
2.BufferedWriter或BufferedReader的缓冲区太小了,默认的是8192,修改后还是没解决,如果把缓冲区值变大,会影响运行速度,而且文件过大时,还是会出现内容缺失,文件过小时,干脆整个文件为空。这让我很不解。
3.代码的顺序导致bug。仔细研究了BufferedWriter和BufferedReader的用法后,发现了一个隐藏的
bug:
对1.txt进行了BufferedWriter的write()操作后,紧接着使用了BufferedReader的readline()操作,把从BufferedReader缓冲区中读取的写到2.txt中,就很大可能出现部分内容缺失的问题。
why:
对1.txt进行写操作后,没有进行flush(),或flush()和close()操作就对进行读操作,此时有部分内容还在缓冲区中,没有写进1.txt中,自然,此时在1.txt中读到的内容就不完整,写到2.txt的也是不完整的。
这涉及另一个问题,就是,write(str)不是当有str传过来就会马上写到文件中的,而是先存放在缓冲区中,当缓冲区中有一定数量的字符流或有flush操作后,才会一次性写到文件中。
总结:使用BufferedWriter一定要注意刷新flush,关闭流close