在单元测试中,我覆盖一个配置文件来测试处理错误的属性值。 我正在使用 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/