Java-安全地检查网络驱动器上是否存在文件
我想测试挂载的网络驱动器上是否存在文件。 我使用 它大部分工作正常,但我发现一个边缘情况下,这段代码是有问题的。 如果驱动器已安装且由于某种原因网络连接出现故障, 程序挂起很长时间(10分钟) 即使我尝试使用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
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"));