Module  java.base
软件包  java.nio.file

Class FileSystem

  • All Implemented Interfaces:
    CloseableAutoCloseable


    public abstract class FileSystem
    extends Object
    implements Closeable
    提供文件系统的接口,并且是工厂用于访问文件系统中的文件和其他对象的对象。

    通过调用FileSystems.getDefault方法获得的默认文件系统提供对Java虚拟机可访问的文件系统的访问。 FileSystems类定义了创建可以访问其他类型(自定义)文件系统的文件系统的方法。

    文件系统是几种类型对象的工厂:

    文件系统差别很大。 在某些情况下,文件系统是具有一个顶级根目录的单个文件层次结构。 在其他情况下,它可能有几个不同的文件层次结构,每个都有自己的顶级根目录。 getRootDirectories方法可用于遍历文件系统中的根目录。 文件系统通常由提供文件存储的一个或多个底层file-stores组成。 这些文件存储还可以在其支持的功能以及与文件相关联的文件属性或元数据中不同。

    文件系统在创建时打开,可以通过调用其close方法关闭文件系统。 一旦关闭,进一步尝试访问文件系统中的对象将导致ClosedFileSystemException被抛出。 默认情况下创建的文件系统不能关闭provider

    A FileSystem可以提供对文件系统的只读或读写访问。 当创建FileSystem时,是否建立文件系统提供只读访问,并可以通过调用其isReadOnly方法进行测试。 通过与只读文件系统相关联的对象写入文件存储库的尝试将抛出ReadOnlyFileSystemException

    文件系统是安全的多个并发线程使用。 可以随时调用close方法来关闭文件系统,但文件系统是否是异步可关闭的是提供者特定的,因此未指定。 换句话说,如果线程正在访问文件系统中的对象,而另一个线程调用close方法,则可能需要阻止直到第一个操作完成。 关闭文件系统会导致与文件系统关联的所有打开的通道,监视服务和其他closeable对象关闭。

    从以下版本开始:
    1.7
    • 构造方法详细信息

      • FileSystem

        protected FileSystem​()
        初始化此类的新实例。
    • 方法详细信息

      • provider

        public abstract FileSystemProvider provider​()
        返回创建此文件系统的提供程序。
        结果
        创建此文件系统的提供程序。
      • isOpen

        public abstract boolean isOpen​()
        告诉这个文件系统是否打开。

        默认提供程序创建的文件系统始终打开。

        结果
        true如果,并且只有这个文件系统是打开的
      • isReadOnly

        public abstract boolean isReadOnly​()
        告诉这个文件系统是否只允许只读访问其文件存储。
        结果
        true如果,且仅当此文件系统提供只读访问权限
      • getSeparator

        public abstract String getSeparator​()
        返回名称分隔符,表示为字符串。

        名称分隔符用于分隔路径字符串中的名称。 实现可以支持多个名称分隔符,在这种情况下,此方法返回一个实现特定的默认名称分隔符。 通过调用toString()方法创建路径字符串时使用此分隔符。

        在默认提供程序的情况下,此方法返回与File.separator相同的分隔符。

        结果
        名称分隔符
      • getRootDirectories

        public abstract Iterable<Path> getRootDirectories​()
        返回一个对象来遍历根目录的路径。

        文件系统提供对文件存储的访问,该文件存储可以由多个不同的文件层次结构组成,每个具有其自己的顶级根目录。 除非安全管理器被拒绝,否则返回的迭代器中的每个元素都对应于不同文件层次结构的根目录。 元素的顺序没有定义。 文件层次结构可能会在Java虚拟机的生命周期内更改。 例如,在一些实现中,可移动介质的插入可能导致用其自己的顶级目录创建新的文件层次结构。

        安装安全管理器时,会调用它来检查对每个根目录的访问。 如果被拒绝,则根目录不会由迭代器返回。 在默认提供程序的情况下,将调用SecurityManager.checkRead(String)方法来检查对每个根目录的读取访问。 如果获取迭代器或迭代时执行权限检查,则系统依赖。

        结果
        一个对象来遍历根目录
      • getFileStores

        public abstract Iterable<FileStore> getFileStores​()
        返回一个对象,以遍历底层文件存储。

        返回的迭代器的元素是这个文件系统的FileStores 未定义元素的顺序,并且文件存储可能会在Java虚拟机的生命周期内更改。 当发生I / O错误时,可能是因为文件存储不可访问,那么它不会被迭代器返回。

        在默认提供程序的情况下,并安装了安全管理器,将调用安全管理器以检查RuntimePermission ("getFileStoreAttributes") 如果被拒绝,则迭代器不会返回任何文件存储。 另外,调用安全管理器的SecurityManager.checkRead(String)方法来检查对文件存储最顶层目录的读取访问。 如果被拒绝,文件存储不会被迭代器返回。 如果获取迭代器或迭代时执行权限检查,则系统依赖。

        使用示例:假设我们要打印所有文件存储的空间使用情况:

          for (FileStore store: FileSystems.getDefault().getFileStores()) {
                 long total = store.getTotalSpace() / 1024;
                 long used = (store.getTotalSpace() - store.getUnallocatedSpace()) / 1024;
                 long avail = store.getUsableSpace() / 1024;
                 System.out.format("%-20s %12d %12d %12d%n", store, total, used, avail);
             } 
        结果
        一个对象来迭代备份文件存储
      • getPath

        public abstract Path getPath​(String first,
                                     String... more)
        将路径字符串或连接到路径字符串的字符串序列转换为Path 如果more没有指定任何元素,那么first参数的值是要转换的路径字符串。 如果more指定一个或多个元素,则每个非空字符串(包括first )都被认为是一系列名称元素(见Path ),并被连接形成路径字符串。 关于字符串如何连接的细节是提供者特定的,但通常它们将使用name-separator作为分隔符来连接。 例如,如果名称分隔符为“ / ”并且调用了getPath("/foo","bar","gus") ,则路径字符串"/foo/bar/gus"将转换为Path 一个Path表示空路径如果返回first为空字符串,并且more不包含任何非空字符串。

        对路径对象的解析和转换是固有的依赖于实现的。 在最简单的情况下,路径字符串被拒绝,并且抛出InvalidPathException ,如果路径字符串包含不能转换为与文件存储合法的字符的字符。 例如,在UNIX系统上,NUL(\ u0000)字符不允许存在于路径中。 实现可以选择拒绝包含比任何文件存储允许的名称长的路径字符串,并且在实现支持复杂路径语法的情况下,它可以选择拒绝严重形成的路径字符串。

        在默认提供程序的情况下,路径字符串将根据平台或虚拟文件系统级别的路径定义进行解析。 例如,操作系统可能不允许在文件名中存在特定字符,但是特定的底层文件存储可能对该组合法字符施加不同的或附加的限制。

        当路径字符串无法转换为路径时,此方法将抛出InvalidPathException 在可能的情况下,如果适用,创建一个异常,其值为index表示path参数中导致路径字符串被拒绝的第一个位置。

        参数
        first - 路径字符串或路径字符串的初始部分
        more - 要连接以形成路径字符串的其他字符串
        结果
        结果 Path
        异常
        InvalidPathException - 如果路径字符串无法转换
      • getPathMatcher

        public abstract PathMatcher getPathMatcher​(String syntaxAndPattern)
        返回一个PathMatcher ,通过解释给定的模式对Path对象的String表示执行匹配操作。 syntaxAndPattern参数标识语法和模式,并采取以下格式:
         syntax:pattern
         
        其中':'代表自己。

        A FileSystem实现支持“ glob ”和“ regex ”语法,并可能支持其他语言。 比较语法组件的值而不考虑情况。

        当语法为“ glob ”时,路径的String表示将使用类似正则表达式但具有更简单语法的有限模式语言进行匹配。 例如:

        Pattern Language
        *.java Matches a path that represents a file name ending in .java
        *.* Matches file names containing a dot
        *.{java,class} Matches file names ending with .java or .class
        foo.? Matches file names starting with foo. and a single character extension
        /home/*/* Matches /home/gus/data on UNIX platforms
        /home/** Matches /home/gus and /home/gus/data on UNIX platforms
        C:\\* Matches C:\foo and C:\bar on the Windows platform (note that the backslash is escaped; as a string literal in the Java Language the pattern would be "C:\\\\*")

        以下规则用于解释glob模式:

        • 所述*字符匹配零个或多个characters一个的name部件不交叉目录边界。

        • **字符匹配零个或多个characters跨越目录边界。

        • ?字符匹配一个名称组件的一个字符。

        • 反斜杠字符( \ )用于转义否则将被解释为特殊字符的字符。 表达式\\匹配单个反斜杠,“\ {”匹配左括号例如。

        • [ ]字符是一个括号表达式 ,与一组字符中的名称组件的单个字符匹配。 例如, [abc]匹配"a""b" ,或"c" 连字号( - )可用于指定范围,因此[a-z]指定从"a""z" (含)的匹配范围。 这些形式可以被混合,从而[ABCE-G]匹配"a""b""c""e""f""g" 如果之后的字符[!然后它被用于否定所以[!a-c]匹配的任何字符以外"a""b" ,或"c"

          在括号表达式的*?\字符匹配自身。 - )字符匹配自己,如果它是括号中的第一个字符,或!之后的第一个字符,如果否定。

        • { }字符是一组子模式,组中的任何子模式匹配时,组匹配。 ","字符用于分隔子模式。 组不能嵌套。

        • 领导期/文件名中的点字符在匹配操作中被视为常规字符。 例如, "*" glob模式匹配文件名".login" 可以使用Files.isHidden(java.nio.file.Path)方法来测试文件是否被隐藏。

        • 所有其他角色都以实现依赖的方式进行匹配。 这包括代表任何name-separators字符。

        • root组件的匹配高度依赖于实现,并未指定。

        当语法为“ regex ”时,模式组件是由Pattern类定义的正则表达式。

        对于glob和正则表达式语法,匹配的细节(例如匹配是否区分大小写)是否依赖于实现,因此未指定。

        参数
        syntaxAndPattern - 语法和模式
        结果
        路径匹配器,可用于匹配与模式相匹配的路径
        异常
        IllegalArgumentException - 如果参数不采取以下形式: syntax:pattern
        PatternSyntaxException - 如果模式无效
        UnsupportedOperationException - 如果模式语法对实现不了解
        另请参见:
        Files.newDirectoryStream(Path,String)
      • getUserPrincipalLookupService

        public abstract UserPrincipalLookupService getUserPrincipalLookupService​()
        返回此文件系统的UserPrincipalLookupService (可选操作) 所得到的查找服务可用于查找用户或组名称。

        使用示例:假设我们要让“joe”文件的所有者:

          UserPrincipalLookupService lookupService = FileSystems.getDefault().getUserPrincipalLookupService();
             Files.setOwner(path, lookupService.lookupPrincipalByName("joe")); 
        结果
        这个文件系统的 UserPrincipalLookupService
        异常
        UnsupportedOperationException - 如果这个 FileSystem没有查找服务
      • newWatchService

        public abstract WatchService newWatchService​()
                                              throws IOException
        构造新的WatchService (可选操作)

        此方法构造一个新的watch服务,可以用于监视注册对象的更改和事件。

        结果
        新的手表服务
        异常
        UnsupportedOperationException - 如果这个FileSystem不支持观察文件系统对象的更改和事件。 由默认提供程序创建的FileSystems不会抛出此异常。
        IOException - If an I/O error occurs