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:
@Testpublic void test5(){ BufferedWriter bufferedWriter = null; BufferedReader bufferedReader = null; try {bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream('G://reader.txt'),'GBK'));//写入流,设置缓存区大小为1024KbufferedWriter = 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('安全结束');}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持好吧啦网。
相关文章: