Java:检查符号链接文件是否存在

我们在这里讨论java 1.6。 由于尚未支持symoblic链接,如何检查它们的存在。

1:告诉链接文件本身是否存在(即使链接断开也返回true)

2:按照链接告诉wheather底层文件存在。

除了JNI,真的没有办法实现这个吗?

它很慢,但你可以比较文件的getAbsolutePath()和getCanonicalPath()。 因此,只能在性能关键代码路径之外使用。

以下应该给你一个开始:

 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进行相关的本机OS特定库调用。

嗯……还不支持..它是否会受到支持是我脑子里想到这个问题的问题…符号链接是特定于平台的,Java应该是独立于平台的。 我怀疑这种类型是否有可能与java一样……您可能不得不求助于此部分的本机代码并使用JNI将其与java中的其余程序桥接。

#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); } 

不是非常有效但直截了当。