Java File.exists 和其他文件操作为现有文件返回错误结果(网络、macosx)

标签 java macos networking filesystems

文件系统 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/

相关文章:

c - 您可以在一个套接字接收调用中获得两个数据包以进行多播吗?

java - 在不使用 JSONObject 的情况下检查下一个 token 的类型是 double、long 还是 int

java - Hibernate DiscriminatorColumn.Type 不工作

macos - osx 音频单元多 channel 输出

macos - 如何在 Mac OS 上使用 date 命令获取当前星期几?

java - 多播数据包未正确到达 podman 内部。已找到解决方法,但不清楚是防火墙问题还是 podman 问题?

java - 计算多个表中的实体数量

java - 在 linux 和 macintosh 上查找 "application data"的目录

c++ - 我怎样才能知道我的 C++ 应用程序在 Mac 上使用了多少内存

python - 如何在 Linux 中模拟套接字连接超时?