Java copy-overwrite文件,在读取时获取旧文件

时间:2011-12-09 22:12:54

标签: 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文件的属性,而不是新复制的版本

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

您需要重置它:

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

// Copy and overwrite "the.file"

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

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

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

这实际上可用于创建永远不需要清理的临时文件:创建文件,然后立即取消链接,同时保持打开状态。关闭文件句柄时,会收到inode

答案 1 :(得分:1)

我意识到这并没有直接回答你的问题,但我认为最好维护两个单独的文件,并安排你的代码在运行时配置/注入配置文件的名称。这样,您的测试可以指定要使用的配置文件,而不是覆盖单个文件。