Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-安全地检查网络驱动器上是否存在文件_Java_Macos_Filesystems - Fatal编程技术网

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

Java-安全地检查网络驱动器上是否存在文件,java,macos,filesystems,Java,Macos,Filesystems,我想测试挂载的网络驱动器上是否存在文件。 我使用 它大部分工作正常,但我发现一个边缘情况下,这段代码是有问题的。 如果驱动器已安装且由于某种原因网络连接出现故障, 程序挂起很长时间(10分钟) 即使我尝试使用kill信号终止它,进程仍在运行 1875 ttys000 0:00.00 (java) java.nio的问题与java.nio的问题相同: Files.exists(Paths.get("/Volumes/DATA/testedFile.txt")); 我在OS X Yosem

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

我使用

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

即使我尝试使用
kill
信号终止它,进程仍在运行

1875 ttys000    0:00.00 (java)
java.nio的问题与
java.nio的问题相同:

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

我在OS X Yosemite上使用java版本1.8.020。

文件类严重依赖本地文件系统,而不知道其背后有某种网络。 如果要使应用程序保持响应,可以尝试从另一个
线程调用
新文件(“/Volumes/DATA/testedFile.txt”).exists()

希望这能有所帮助。

java中的File#exists方法只是本地O/S调用的包装,这需要很长时间。我的建议是在你的程序中实现一个超时;如果调用在较短时间内未返回,则假定该文件不存在。注意一种可能的方法


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

虽然变化不大,但您是否尝试过使用
java.nio.file.Files#exists()
?@fge,是的。这是我的第一次尝试。那么,请继续使用java.nio.file。这是2015年,你无论如何都应该删除文件。很抱歉,这两个文件都失败了。我也有同样的问题:
Files.exists(path.get(“/Volumes/DATA/testedFile.txt”)
是的,我明白,这不是我的观点;我的观点是,如果您使用java.nio.file,请停止使用文件。文件有很多问题,而java.nio.File没有。这就是我尝试过的。它是有效的。。。大部分。但是,例如,后台线程没有响应,因此我无法退出应用程序。您可以通过将该线程设置为守护进程线程(setDaemon(true))来解决这个问题。是的,我尝试在另一个线程中超时运行此代码。它是有效的。。。大部分。但例如,线程没有响应,因此我无法退出应用程序。@DavidZimmerman指的是守护进程线程,这不会阻止JVM退出。您可以通过将中定义的ThreadFactory作为第二个参数传递给简单超时示例中的
Executors#newScheduledThreadPool
调用来完成此操作。@AdrianLeonhard我也尝试过使用守护进程线程。线程根本没有响应,使我的应用程序保持活动状态。如果您无法从O/S中终止线程/进程(如果我理解正确,这就是您尝试使用终止信号所做的),则可能意味着文件系统调用是不可中断的。。。如果是这种情况,这个问题就不能用Java来解决。如果其他应用程序尝试访问有问题的网络驱动器,它们是否会停止响应?@AdrianLeonhard噢,很好!我对一个简单的
tail-f/Volumes/DATA/testedFile.txt
也有同样的问题。你能更新你的答案吗?我会接受的!谢谢,即使我的问题没有解决。。。至少诊断结果更好。
1875 ttys000    0:00.00 (java)
Files.exists(Paths.get("/Volumes/DATA/testedFile.txt"));