我想测试已安装的网络驱动器上是否存在文件。
我使用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。
答案 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
。
希望这有帮助。