好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java BufferWriter写文件写不进去或缺失数据的解决

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

查看更多关于Java BufferWriter写文件写不进去或缺失数据的解决的详细内容...

  阅读:48次