背景
最近做的项目对文件的操作比较频繁,咱们知道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();