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

时间:2015-02-02 13:38:41

标签: java macos filesystems

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

我使用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。

2 个答案:

答案 0 :(得分:3)

java中的File#exists方法只是本机O / S调用的包装器,这就是这么长的时间。我的建议是在你的程序中实现超时;假设如果呼叫在较短时间内没有返回,则该文件不存在。 Simple timeout in java注意到可能的方法。

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

答案 1 :(得分:1)

File类在很大程度上依赖于本地文件系统而不知道它背后是某种网络。 如果您想让应用程序保持响应,可以尝试从另一个new File("/Volumes/DATA/testedFile.txt").exists()拨打Thread

希望这有帮助。