org.apache.commons.io.FileUtils.writeStringToFile写入文件失败

本文探讨了使用Apache Common IO库进行文件写入时遇到的一个常见问题:由于未正确刷新缓存导致的数据丢失。文章详细解释了问题产生的原因,并提供了一个简单的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近做的项目对文件的操作比较频繁,咱们知道apache已经帮我买写好了一套工具,自己写还比较费力,重要的是咱们写出的不一定比别人好,而且可能存在bug的风险。
当然,别人写的代码不一定全是对的,这不找到一个common.io的bug。

写入文件失败原因

咱们看下源码会存在写入文件失败!

writeStringToFile
public static void writeStringToFile(File file, String data, Charset charset, boolean append) throws IOException {
    // 创建一个文件的输入流
    OutputStream out = openOutputStream(file, append);
    Throwable var5 = null;
    try {
    	// 把字符串写入文件,重点
        IOUtils.write(data, out, charset);
    } catch (Throwable var14) {
        var5 = var14;
        throw var14;
    } finally {
    }
}
IOUtils.write(data, out, charset);

大家都知道,write写入文件的时候内部的把字符串转换成字节数组,而不同的计算机系统默认的字节大小还不一样,所以咱们IO中的文件会被分文多个存储块,当一个块,而且没装满的时候,write方法默认是还有内容要写入,假如没有内容,这时候字符串内容写入缓存的数据并没有同步到磁盘,但是咱们的流已经被关闭了,所以文件写入失败!!!

// 调用output的write方法
public static void write(String data, OutputStream output, Charset charset) throws IOException {
    if (data != null) {
        output.write(data.getBytes(Charsets.toCharset(charset)));
    }
}

解决方案

在调用output.write之后,close()之前,强制把缓存中的字节刷入磁盘

output.write(data.getBytes(Charsets.toCharset(charset)));
output.flush();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值