Java复制覆盖文件,读取时获取旧文件

标签 java file copy

在单元测试中,我覆盖一个配置文件来测试处理错误的属性值。 我正在使用 Apache Commons IO:

org.apache.commons.io.FileUtils.copyFile(new File(configDir, "xyz.properties.badValue"), new File(configDir, "xyz.properties"), false)

在调查文件系统时,我可以看到 xyz.properties 实际上被覆盖 - 大小已更新,内容与 xyz.properties.badValue 相同>.

当我完成测试用例,该测试用例通过将文件读入 Properties 对象的代码(使用 FileReader 对象)时,我得到原始 xyz.properties 的属性> 文件,而不是新复制的版本。

通过调试,我单步执行并调查文件,我可以排除它是写入文件系统的计时问题。

复制步骤是否以某种方式保存文件句柄?如果是的话我该如何再次释放它? 如果没有,有人知道为什么会发生这种情况以及如何解决它吗?

谢谢。

最佳答案

如果您在此对象之前初始化了 FileReader 对象,那么它将已经存储了旧版本的临时副本。

您需要重置它:

FileReader f = new FileReader("the.file");

// Copy and overwrite "the.file"

f = new FileReader("the.file");

在 Unix 文件系统模型中,只要有人在文件中打开了 filehandle,或者有一个目录条目指向,包含文件内容的 inode 就会持续存在到它。

替换目录中文件的名称,不会删除inode(文件的内容),因此您已经打开的文件句柄可以继续使用。

这实际上可以用来创建不需要清理的临时文件:创建文件,然后立即取消链接,同时保持其打开状态。当您关闭文件句柄时,inode 就会被收获

关于Java复制覆盖文件,读取时获取旧文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452369/

相关文章:

C - 将文本中的值存储到数组中

java - 不使用 renameTo() move 文件

java - 如何使用同一工作簿读取和写入Excel文件(.xlsx)?

java - 将 HTML 字符串传递给 jQuery 函数

java - 如何对读取给定文件的方法进行单元测试

python - 如何在 Python 中构建一个所有值都是 [] 的独立实例的字典?

Java:复制非原始类型的数组

java - Java 中的 Word 文档创建 API

java - 在 web.xml 中发现以元素 'display-name' 开头的无效内容

Java 如何比较 XML 数据与文件扩展名