Java - 检查网络驱动器上是否存在文件

Java - check safely if a file exist on a network drive

我想测试安装的网络驱动器上是否存在文件。

我使用 File.exists 编写了这个简单的代码。

import java.io.File;

public class NetworkDrive {
    public static void main(String[] args) {
        System.err.println(new File("/Volumes/DATA/testedFile.txt").exists());
    }
}

它大部分工作正常,但我发现了一个边缘情况,该代码有问题。 如果驱动器已安装并且由于某种原因网络连接失败, 程序挂起很长时间(10 分钟)。

time java NetworkDrive
false

real    10m6.114s
user    0m0.431s
sys 0m0.949s

即使我尝试使用 KILL 信号杀死它,进程仍然是 运行。

1875 ttys000    0:00.00 (java)

问题和java.nio一样:

Files.exists(Paths.get("/Volumes/DATA/testedFile.txt"));

我在 OS X Yosemite.

上使用 java 版本 1.8.0_20

文件 class 严重依赖本地文件系统,而不知道其背后有某种网络。 如果你想让应用程序保持响应,你可以尝试从另一个 Thread.

调用 new File("/Volumes/DATA/testedFile.txt").exists()

希望对您有所帮助。

java 中的 File#exists 方法只是对本机 O/S 调用的包装,这就是花费这么长时间的原因。我的建议是在您的程序中实施超时;如果调用在更短的时间内没有return,则假设文件不存在。 Simple timeout in java 指出了一种可能的方法。

编辑:即使使用 KILL 信号也无法终止线程这一事实表明系统调用是不可中断的。这是 O/S 的问题,无法在 Java 中解决。虽然它确实阻止程序在调用 运行 时结束(即使您将线程标记为守护进程),您仍然可以通过在另一个线程中执行调用来解决它:这样,您可以假设在主线程中较短的超时后调用失败并继续执行程序,即使调用仍在后台 运行。