文件系统 AirportHDD 从一开始就挂载 (AFP),当我启动这个小程序时文件就存在了。 我试图找出一整天为什么以下方法不起作用,但找不到任何解决方案:
public static void main(String[] arguments)
{
while(1==1)
{
File f=new File(
"/Volumes/AirportHDD/test/lock.csv");
System.out.println(f.exists());
AmySystem.sleep(100);
}
}
输出是: 真的,真的,……
一旦我从另一台计算机上删除文件(AirportHDD 是通过网络安装的硬盘),输出就会一直说: 真的,真的,…… 当我打开 finder 并转到此目录时,输出更改为:false, false, ...
再次添加文件时(通过另一台电脑)输出仍然是: 假的,假的,...
但是如果你再次打开 finder 并点击目录并且 finder 显示现有文件,输出突然变为:false, true, true, true, ...
注意:
只要 java “认为”文件不存在,所有其他文件操作(如打开以供读取)也会失败
如果程序本身正在创建和删除文件,则不会出现问题
刚刚测试时发现用 samba 共享一切都可以,但是用 AFP 就不行
有没有办法告诉 java 做与 finder 相同的事情,比如刷新,或者不要尝试缓存,无论如何?
最佳答案
我想您可能正在寻找 WatchService . Oracle 也很友好地提供了一个 tutorial .
由于无法保证这些链接的生命周期,我将在几分钟内编辑示例代码。我只是想让你知道,我想我找到了一些东西,以防你想开始自己研究。
更新
按照链接教程,我想出了这样的代码。我不确定它是否会起作用(没有时间测试它),但它可能足以让您入门。 WatchService
还有一个等待事件的 take()
方法,这意味着您可以根据您提供的最后一个输出假设文件存在(或不存在) .这实际上取决于该程序将与之交互的内容。
如果这行得通,那就太好了。如果没有,也许我们可以根据您遇到的任何错误找出解决方法。或者,如果其他人比我更熟悉此代码,他们可能会出现并提供此代码的更好版本(或完全更好的选择)。
public static void main(String[] arguments) {
Path path = Paths.get("/Volumes/AirportHDD/test/lock.csv");
WatchService watcher = FileSystems.getDefault().newWatchService();
WatchKey key = null;
try {
key = path.register(watcher,
ENTRY_CREATE,
ENTRY_DELETE);
} catch (IOException x) {
System.err.println(x);
}
while(true) {//I tend to favor this infinite loop, but that's just preference.
key = watcher.poll();
if(key != null) {
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
if (kind == OVERFLOW || kind == ENTRY_DELETE) {
System.out.println(false);
}
else if (kind == ENTRY_CREATE) {
System.out.println(true);
}
}//for(all events)
}//if(file event occured)
else {
File f=new File(path);
System.out.println(f.exists());
}//else(no file event occured)
AmySystem.sleep(100);
}//while(true)
}//main() method
关于Java File.exists 和其他文件操作为现有文件返回错误结果(网络、macosx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18234447/