Java BufferWriter写文件之后文件是空的或者数据不全
在编程的过程中,读写文件是非常常见的操作,在这里我问介绍一下最近我遇到的集中写文件写不进去的情况。首先给出完整的代码。
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { String filename = "src/data/write.txt"; BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); for (int i = 1; i <= 10; i++) { bw.write(i + " "); } bw.close(); } }
这个代码是正常的文件写入过程的实现,首先定义BufferedWriter对象指向对应的文件,之后执行写操作,完成之后关闭bw.close();
问题1:在编码的过程中,忘记bw.close(),那么会出现数据写入不全或者为空的问题
这是很常见的错误,这是因为BufferedWriter是采用缓冲区的方式写入,即写入的数据先放到缓冲区,之后等缓冲区满之后一起写到文件中。close()的目的便是强制将缓冲区中的数据写入到文件中,即使缓冲区中的数据还不满。
问题2:即写入文件的格式问题可能导致文件为空
这里我遇到的情况是,打算写几千个数据到txt文本中,放置在一行,之间用空格隔开,会出现空文件,这是因为几千个数据是不能放置在一行中,因为txt等文件格式对文件的行数没有什么要求,但是对列数做出了要求,即一行中的数据不能超过最大值,但是可以写足够多的行。
下面用一个例子说明情况:
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { String filename = "src/data/write.txt"; BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); for (int i = 1; i <= 3000; i++) { bw.write(i + " "); } bw.close(); } }
还是刚才的代码,但是需要的数据是3000个,且写在同一行中,会发现空文件。
而将bw.write(i + " ");换成bw.write(i + "\n");会发现文件成功写入。
BufferedWriter写入文件注意事项
对于文本文件,使用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("安全结束"); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。