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

作者:spcoder 时间:2023-07-20 14:57:02 

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("安全结束");
}

来源:https://blog.csdn.net/m0_37683327/article/details/115412606

标签:Java,BufferWriter,缺失数据
0
投稿

猜你喜欢

  • Java中定时器Timer致命缺点案例详解

    2022-08-27 08:38:45
  • SpringBoot MongoDB与MongoDB GridFS基本使用

    2023-07-31 06:26:47
  • 用Java实现24点游戏

    2022-07-18 20:56:14
  • Android开发必备知识 为什么说Kotlin值得一试

    2022-02-09 08:41:38
  • 关于Lambda表达式的方法引用和构造器引用简的单示例

    2022-09-18 05:02:08
  • C#实现文件断点续传下载的方法

    2021-09-05 10:37:42
  • Java详细讲解堆排序与时间复杂度的概念

    2023-10-20 02:00:11
  • C#多线程系列之线程完成数

    2021-12-24 03:07:47
  • Java设计模式的事件模型详解

    2023-11-29 04:47:08
  • SpringCloud基本Rest微服务工程搭建过程

    2023-08-28 16:23:29
  • Spring Boot 配置和使用多线程池的实现

    2022-09-04 19:53:02
  • C# Chart 简单使用教程

    2021-05-29 07:41:34
  • 如何在springBoot下搭建日志框架

    2021-07-01 03:41:44
  • Java 超详细讲解类的定义方式和对象的实例化

    2021-09-11 17:38:29
  • C#高性能动态获取对象属性值的步骤

    2022-08-13 13:23:12
  • Android基于Xposed修改微信运动步数实例

    2022-11-06 19:46:57
  • SpringMVC中MultipartFile转File的两种方式

    2023-08-18 20:25:00
  • C#实现单例模式的几种方法总结

    2023-10-13 16:33:55
  • Android编程实现圆角边框布局效果的方法

    2021-06-07 08:54:01
  • 详解SpringMVC如何进行数据回显

    2023-09-12 08:48:15
  • asp之家 软件编程 m.aspxhome.com