我们在这里讨论java 1.6。由于尚未支持symoblic链接,如何检查它们的存在。
1:告诉链接文件本身是否存在(即使链接断开也返回true)
2:按照链接告诉我们底层文件存在。
除了JNI,真的没办法实现这个吗?
答案 0 :(得分:5)
现在看起来那样......除非你选择openjdk http://openjdk.java.net/projects/nio/javadoc/java/nio/file/attribute/BasicFileAttributes.html#isSymbolicLink()
答案 1 :(得分:5)
它很慢但您可以比较文件的getAbsolutePath()和getCanonicalPath()。因此,只能在性能关键代码路径之外使用。
答案 2 :(得分:1)
以下内容应该为您提供一个开始:
if (file.exists() && !file.isDirectory() && !file.isFile()) {
// it is a symbolic link (or a named pipe/socket, or maybe some other things)
}
if (file.exists()) {
try {
file.getCanonicalFile();
} catch (FileNotFoundException ex) {
// it is a broken symbolic link
}
}
击> <击> 撞击>
编辑:上述内容无法正常工作,因为file.isDirectory()和file.isFile()解析了符号链接。 (我们生活和学习!)
如果您需要准确的确定,则需要使用JNI进行相关的本机操作系统特定库调用。
答案 3 :(得分:1)
嗯...还不支持..它是否会受到支持是我脑子里想到这个问题的问题......符号链接是特定于平台的,而Java应该是独立于平台的。我怀疑java是否可以使用这种类型的东西......你可能不得不求助于这部分的本机代码,并使用JNI将它与java中的其余程序桥接。
答案 4 :(得分:0)
#2很简单:只需使用File.isFile
等,它将遍历链接。困难的部分是#1。
所以如果你不能使用java.nio.file
,并且想要避免使用JNI等,那么我发现的唯一有效的方法是:
static boolean exists(File link) {
File[] kids = link.getParentFile().listFiles();
return kids != null && Arrays.asList(kids).contains(link);
}
不是非常有效但很直接。