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

 更新时间:2021年07月21日 14:26:36   作者:spcoder  
这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java OkHttp框架源码深入解析

    Java OkHttp框架源码深入解析

    okhttp是一个第三方类库,用于android中请求网络。这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient
    2022-08-08
  • java大数乘法的简单实现 浮点数乘法运算

    java大数乘法的简单实现 浮点数乘法运算

    大数乘法可以进行任意大小和精度的整数和浮点数的乘法运算, 精确度很高, 可以用作经融等领域的计算,这个是我看了一些资料, 然后自己整理实现的,简单测试了一下
    2014-01-01
  • java多线程实现有序输出ABC

    java多线程实现有序输出ABC

    这篇文章主要为大家详细介绍了java多线程实现有序输出ABC,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 解决MyBatis @param注解参数类型错误异常的问题

    解决MyBatis @param注解参数类型错误异常的问题

    这篇文章主要介绍了解决MyBatis @param注解参数类型错误异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 利用JavaFX工具构建Reactive系统

    利用JavaFX工具构建Reactive系统

    这篇文章主要介绍了使用JavaFX构建Reactive系统,利用JavaFX工具集中的新的超棒特性来构建响应式的快速应用程序,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • java如何获取map中value的最大值

    java如何获取map中value的最大值

    这篇文章主要介绍了java如何获取map中value的最大值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Spring MVC 关于controller的字符编码问题

    Spring MVC 关于controller的字符编码问题

    在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 controller回应相应的数据而不是去渲染某个页面。
    2017-03-03
  • 使用quartz时,传入参数到job中的使用记录

    使用quartz时,传入参数到job中的使用记录

    这篇文章主要介绍了使用quartz时,传入参数到job中的使用记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java实力弹弹球实现代码

    Java实力弹弹球实现代码

    这篇文章主要为大家详细介绍了Java实力弹弹球实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • ZIP4j 压缩与解压的实例详解

    ZIP4j 压缩与解压的实例详解

    这篇文章主要介绍了ZIP4j 压缩与解压的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10

最新评论