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

gon*_*ard 6 java filesystems macos

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

我用这个简单的代码写了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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

time java NetworkDrive
false

real    10m6.114s
user    0m0.431s
sys 0m0.949s
Run Code Online (Sandbox Code Playgroud)

即使我尝试使用KILL信号杀死它,该过程仍在运行.

1875 ttys000    0:00.00 (java)
Run Code Online (Sandbox Code Playgroud)

问题是这样的java.nio:

Files.exists(Paths.get("/Volumes/DATA/testedFile.txt"));
Run Code Online (Sandbox Code Playgroud)

我在OS X Yosemite上使用java版本1.8.0_20.

Adr*_*ard 3

java 中的 File#exists 方法只是本机 O/S 调用的包装器,而这正是花费那么长时间的原因。我的建议是在你的程序中实现超时;如果调用在较短的时间内没有返回,则假设该文件不存在。java 中的简单超时指出了一种可能的方法。

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