Java BufferWriter写文件之后文件是空的或者数据不全
在编程的过程中,读写文件是非常常见的操作,在这里我问介绍一下最近我遇到的集中写文件写不进去的情况。首先给出完整的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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等文件格式对文件的行数没有什么要求,但是对列数做出了要求,即一行中的数据不能超过最大值,但是可以写足够多的行。
下面用一个例子说明情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
@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( "安全结束" ); } |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/m0_37683327/article/details/115412606