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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 部署到webapps目录启动本文使用的Spring版本为Spring6,SpringBoot版本为3,JDK为17,可能会和之前有细微不同,
- 对于大规模乱序的数组,插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组地一段移动到另一端。希尔排序改进了插入排序,交换不
- 演示代码如下:package swt_jface.demo11; import org.eclipse.swt.SWT; import or
- 异步方法很好的解决了这些问题,异步执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不会死掉了。异步如何开始,好理解,现在
- java控制台输出图书馆管理系统(只用java代码不用数据库和GUI,java入门的新手秒懂)在个项目中,我只用数组保存数据,和只用for循
- 本文实例讲述了C#中Memcached缓存的用法,分享给大家供大家参考。具体方法如下:ICacheStrategy.cs文件如下:publi
- 在Java项目开发中,Maven是我们最常用的依赖管理和构建工具了!我们常常通过添加dependency节点,就能够很方便地加入依赖,而不需
- 本文实例为大家分享了C++实现图书馆管理系统的具体代码,供大家参考,具体内容如下总体思想用C++开发图书馆管理系统需要对学生和图书分别建立c
- IP地址与整数之间的转换1、IP地址转换为整数原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然
- 我先解释一下什么叫IO流:I:指的是InputStream,这是一个抽象类,最常用的子类是FileInputStreamO:值得是Outpu
- 本文为大家分享了C#利用VS中插件打包并发布winfrom程序,供大家参考,具体内容如下1.先在VS 的扩展更新中搜索此插件【2015 in
- 我们知道,值类型的变量是在堆栈上分配内存的,而引用类型包括System.Object的对象是在堆上分配内存的,基于这一特点,当值类型被类型转
- 介绍Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一
- 前言最近在Android Automotive 上遇到的一些问题,有好几个都跟Android 车载操作系统上应用的驾驶模式有关,国内这方面的
- ViewPagerIndicator导航栏指示器运行效果:实现这个效果,我是看了很多大神写的博客和视频后自己敲的,欢迎指正github地址:
- 本文实例讲述了Android开发实现删除联系人通话记录的方法。分享给大家供大家参考,具体如下:1. 负责存放呼叫记录的内容提供者源码在 Co
- 一、什么是JWTJSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案。现在的项目开发一般都是前端端分离,这就涉及到
- 相信不少喜欢开发的朋友都已经知道微信小程序是个什么物种了,楼主也是从小程序内测期间就开始关注,并且也写过几个已经上线的微信小程序。但是基本上
- 本文介绍了JAVA 根据设置的概率生成随机数的方法,分享给大家import java.util.ArrayList;import java.
- Java String源码分析什么是不可变对象?众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这