我正在使用 apache util 将文件复制到使用fileutil.copyFile(src, dest)
我正在复制的文件由外部供应商每 2 秒更新一次,我真的不想锁定它(我的应用程序在 Windows 中运行——这会导致各种问题)。我希望有人可以帮助我建议在不锁定源文件的情况下复制甚至读取文件的最安全方法是什么?
亲切的问候
因为您没有在复制操作之前明确锁定整个文件,所以默认的 os 文件锁定机制正在工作。
我运行了一个快速测试程序来查看当您在外部进程每 2 秒写入文件时复制源文件时在 Windows 机器上会发生什么。
写入文件的进程从未遇到过问题。
public static void main(String[] args) {
File f = new File("..\\test.txt");
long startTime = System.currentTimeMillis();
long elapsedTime = 0;
while (elapsedTime < 1000 * 60) {
try {
FileUtils.writeStringToFile(f, System.currentTimeMillis()+" : Data Write\r\n", true);
Thread.sleep(2000);
} catch (IOException ex) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex){
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
}
elapsedTime = System.currentTimeMillis() - startTime;
}
}
如果在源文件更改长度之前没有完成复制,复制文件的进程将抛出异常。看来,此异常更像是文件的复制版本不完整的警告。当我同步时间以防止在写入文件的同时读取文件时,不会引发此异常。
public static void main(String[] args) {
File f = new File("..\\test.txt");
long startTime = System.currentTimeMillis();
long elapsedTime = 0;
while (elapsedTime < 1000 * 60) {
try {
FileUtils.copyFile(f, new File("..\\test\\test.txt"));
Thread.sleep(2000);
} catch (IOException ex) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex){
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
}
elapsedTime = System.currentTimeMillis() - startTime;
}
}
基于这个测试,我不会担心写作过程会发生什么。java.io.IOException: Failed to copy full contents from '..\test.txt' to '..\test\test.txt'
当被抛出时,我会做一些事情来处理这个案子。
这是How to Cache a File in Java的摘录,更多内容可以在此处找到。
在 Java 中缓存文件
从磁盘读取文件可能会很慢,尤其是当应用程序多次读取同一个文件时。缓存通过将经常访问的文件保存在内存中来解决这个问题。这允许应用程序从快速本地内存而不是慢速硬盘驱动器读取内容。在 Java 中缓存文件的设计包括三个要素:
缓存文件的算法
缓存文件的通用算法必须考虑文件修改,并由以下步骤组成: