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

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

相关文章

  • SpringMvc返回modelandview返回的页面无法跳转问题及解决

    SpringMvc返回modelandview返回的页面无法跳转问题及解决

    这篇文章主要介绍了SpringMvc返回modelandview返回的页面无法跳转问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • java8 toMap问题(key重复如何解决)

    java8 toMap问题(key重复如何解决)

    这篇文章主要介绍了java8 toMap问题(key重复如何解决),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 如何根据带账号密码的WSDL地址生成JAVA代码

    如何根据带账号密码的WSDL地址生成JAVA代码

    这篇文章主要介绍了如何根据带账号密码的WSDL地址生成JAVA代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java Socket实现文件发送和接收功能以及遇到的Bug问题

    Java Socket实现文件发送和接收功能以及遇到的Bug问题

    这篇文章主要介绍了Java Socket实现文件发送和接收功能以及遇到的Bug问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java中由substring方法引发的内存泄漏详解

    Java中由substring方法引发的内存泄漏详解

    这篇文章主要介绍了Java中由substring方法引发的内存泄漏详解,涉及substring方法引发的内存泄漏简介,substring的作用和实现原理等相关内容,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • SpringBoot注解@CrossOrigin使用详解

    SpringBoot注解@CrossOrigin使用详解

    这篇文章主要介绍了SpringBoot注解@CrossOrigin使用详解,@CrossOrigin是用来处理跨域请求的注解
    跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制,需要的朋友可以参考下
    2023-12-12
  • 关于struts返回对象json格式数据的方法

    关于struts返回对象json格式数据的方法

    以下为大家介绍,关于struts返回对象json格式数据的方法,希望对有需要的朋友有所帮助。
    2013-04-04
  • spring boot项目中MongoDB的使用方法

    spring boot项目中MongoDB的使用方法

    前段时间分享了关于Spring Boot中使用Redis的文章,除了Redis之后,我们在互联网产品中还经常会用到另外一款著名的NoSQL数据库MongoDB。下面这篇文章主要给大家介绍了关于在spring boot项目中MongoDB的使用方法,需要的朋友可以参考下。
    2017-09-09
  • 如何利用IDEA快速生成实体类

    如何利用IDEA快速生成实体类

    这篇文章主要介绍了如何利用IDEA快速生成实体类问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Spring Boot与Redis的缓存一致性问题解决

    Spring Boot与Redis的缓存一致性问题解决

    在使用缓存时,缓存一致性问题是一个常见的挑战,本文主要介绍了Spring Boot与Redis的缓存一致性问题,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07

最新评论