如何检查文件系统是否支持Java中的链接和符号链接

shu*_*fan 5 java filesystems nio file java-7

Java 7中引入的Files类具有处理链接和符号链接的方法,但仅作为可选操作.

有没有办法在运行时确定文件系统在实际调用相应方法之前是否支持这些操作,还是需要调用它们然后捕获异常?

FileSystemFileStore这样的类似乎没有包含任何内容(或者我忽略了它).

yeg*_*niy 4

我没有看到任何通用的方法,如果不依赖于某个UnsupportedOperationException或其他例外,它将起作用.

您可以使用启发式,假设只BasicFileAttributesView支持符号链接的子类.


注意:下面的方法不起作用,因为FileAttributeViews文件属性不是相同的概念:

我没有得到isSymbolicLinkOS X 10.8.4上以下代码支持的属性之一:

package com.mlbam.internal;

import java.nio.file.Files;
import java.nio.file.FileStore;
import java.nio.file.FileSystems;
import java.nio.file.Paths;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MainClass {
    private static final Logger LOG = LoggerFactory.getLogger(MainClass.class);
    public static void main(String[] args) {
        try {
            System.out.println("FileStore.supportsFileAttributeView('isSymbolicLink'): " 
                + Files.getFileStore(Paths.get("/")).supportsFileAttributeView("isSymbolicLink"));
            // Got: FileStore.supportsFileAttributeView('isSymbolicLink'): false
            System.out.println(FileSystems.getDefault().supportedFileAttributeViews());
            // Got: [basic, owner, unix, posix]
        } catch (Exception e) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

原答案:

如果你有一个实例FileStore,你可以使用FileStore.supportsFileAttributeView("isSymbolicLink")

或者,如果你有一个实例FileSystem,您可以检查导致Set<String>FileSystem.supportedFileAttributeViews()包含字符串"isSymbolicLink".


您可以获得FileStorePath使用相关联Files.getFileStore(Path)

得到的一种方法FileSystem是通过FileSystems.getDefault()


  • “supportsFileAttributeView”方法采用 FileAttributeView 的名称,*而不是*文件属性的名称。这就是为什么它总是为你返回 false 的原因。同样,“FileSystem.supportsFileAttributeViews”返回 FileAttributeView 的名称,而不是文件属性的名称。请参阅[`Files.getAttribute`](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#getAttribute%28java.nio.file.Path,%20java。 lang.String,%20java.nio.file.LinkOption...%29) 了解两种类型名称的描述。 (2认同)