我正在监视传入文件的目录(使用文件更改观察者来自阿帕奇共享)。
class Example implements FileAlterationListener {
public void prepare() {
File directory = new File("/tmp/incoming");
FileAlterationObserver observer = new FileAlterationObserver(directory);
observer.addListener(this);
FileAlterationMonitor monitor = new FileAlterationMonitor(10);
monitor.addObserver(observer);
monitor.start();
// ...
}
public void handleFile(File f) {
// FIXME: this should be called when the writes that
// created the file have completed, not before
}
public void onFileCreate(File f) {
handleFile(f);
}
public void onFileChange(File f) {
handleFile(f);
}
}
这些文件是由我无法控制的进程写入的。
我对该代码的问题是,在最初创建文件时会触发我的回调。我需要它在文件更改并且文件写入完成时触发。 (也许通过检测文件何时stopped改变)
最好的方法是什么?
我有类似的问题。起初我以为我可以使用 FileWatcher 服务,但它不适用于远程卷,而且我必须通过网络安装的驱动器监视传入的文件。
然后我想我可以简单地监视一段时间内文件大小的变化,并在文件大小稳定后考虑文件完成(如 fmucar 建议)。但我发现在某些情况下,对于大文件,托管系统会报告其正在复制的文件的完整大小,而不是其写入磁盘的字节数。这当然使文件看起来稳定,并且我的检测器会在文件仍在写入过程中捕获该文件。
我最终能够通过使用 FileInputStream 异常使监视器正常工作,该异常在检测文件是否正在写入时非常有效,即使文件位于网络安装的驱动器上也是如此。
long oldSize = 0L;
long newSize = 1L;
boolean fileIsOpen = true;
while((newSize > oldSize) || fileIsOpen){
oldSize = this.thread_currentFile.length();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
newSize = this.thread_currentFile.length();
try{
new FileInputStream(this.thread_currentFile);
fileIsOpen = false;
}catch(Exception e){}
}
System.out.println("New file: " + this.thread_currentFile.toString());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)