Java - 检查网络驱动器上是否存在文件
Java - check safely if a file exist on a network drive
我想测试安装的网络驱动器上是否存在文件。
我使用 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
文件 class 严重依赖本地文件系统,而不知道其背后有某种网络。
如果你想让应用程序保持响应,你可以尝试从另一个 Thread
.
调用 new File("/Volumes/DATA/testedFile.txt").exists()
希望对您有所帮助。
java 中的 File#exists 方法只是对本机 O/S 调用的包装,这就是花费这么长时间的原因。我的建议是在您的程序中实施超时;如果调用在更短的时间内没有return,则假设文件不存在。 Simple timeout in java 指出了一种可能的方法。
编辑:即使使用 KILL 信号也无法终止线程这一事实表明系统调用是不可中断的。这是 O/S 的问题,无法在 Java 中解决。虽然它确实阻止程序在调用 运行 时结束(即使您将线程标记为守护进程),您仍然可以通过在另一个线程中执行调用来解决它:这样,您可以假设在主线程中较短的超时后调用失败并继续执行程序,即使调用仍在后台 运行。
我想测试安装的网络驱动器上是否存在文件。
我使用 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文件 class 严重依赖本地文件系统,而不知道其背后有某种网络。
如果你想让应用程序保持响应,你可以尝试从另一个 Thread
.
new File("/Volumes/DATA/testedFile.txt").exists()
希望对您有所帮助。
java 中的 File#exists 方法只是对本机 O/S 调用的包装,这就是花费这么长时间的原因。我的建议是在您的程序中实施超时;如果调用在更短的时间内没有return,则假设文件不存在。 Simple timeout in java 指出了一种可能的方法。
编辑:即使使用 KILL 信号也无法终止线程这一事实表明系统调用是不可中断的。这是 O/S 的问题,无法在 Java 中解决。虽然它确实阻止程序在调用 运行 时结束(即使您将线程标记为守护进程),您仍然可以通过在另一个线程中执行调用来解决它:这样,您可以假设在主线程中较短的超时后调用失败并继续执行程序,即使调用仍在后台 运行。