对于文本文件,使用BufferedReader,BufferedWriter进行读写效率更高,原因是使用了缓存区,其工作流程是:先把文本内容读写到缓存区,缓存区满了,自动把缓存区中的内容读写到文件.
问题:
如果读写完的同时缓冲区刚好装满,那么缓冲区会把里面的数据朝目标文件自动进行读或写,这种时候你直接调用close()方法关闭流是不会出现问题 , 但是如果文件在读写完成时,缓冲区没有装满,就直接调用close()方法,这个时候装在缓冲区的数据就不会自动的朝目标文件进行读或写,造成缓冲区中的这部分数据丢失.
解决方法:
在close()之前先调用flush()方法, 手动使缓冲区数据读写到目标文件
eg:
@Test public void test5(){ BufferedWriter bufferedWriter = null; BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("G://reader.txt"),"GBK")); //写入流,设置缓存区大小为1024K bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("G://writer.txt"),"UTF-8"),1024); String line; while ((line = bufferedReader.readLine()) != null) { bufferedWriter.write(line); bufferedWriter.newLine(); } }catch (Exception e){ log.error("异常:{}",e); }finally { if (bufferedWriter != null) { try { //刷新缓存区 bufferedWriter.flush(); bufferedWriter.close(); } catch (IOException e) { log.error("关闭输出流异常:{}", e); } } if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { log.error("关闭读取流异常:{}", e); } } } log.info("安全结束"); }