模块 java.base

类 FileSystem

java.lang.Object
java.nio.file.FileSystem
所有已实现的接口:
Closeable , AutoCloseable

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

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

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

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

文件系统在创建时是打开的,可以通过调用它的close 方法来关闭。一旦关闭,任何进一步尝试访问文件系统中的对象都会导致抛出 ClosedFileSystemException 。默认创建的文件系统provider 无法关闭。

FileSystem 可以提供对文件系统的只读或读写访问。文件系统是否提供只读访问是在创建 FileSystem 时确定的,可以通过调用其 isReadOnly 方法来测试。尝试通过与只读文件系统关联的对象写入文件存储会抛出 ReadOnlyFileSystemException

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

自从:
1.7
  • 构造方法详细信息

    • FileSystem

      protected FileSystem()
      初始化此类的新实例。
  • 方法详情

    • provider

      public abstract FileSystemProvider  provider()
      返回创建此文件系统的提供者。
      返回:
      创建此文件系统的提供程序。
    • close

      public abstract void close() throws IOException
      关闭此文件系统。

      文件系统关闭后,所有后续对该文件系统的访问,无论是通过此类定义的方法,还是通过与该文件系统关联的对象,都会抛出 ClosedFileSystemException 。如果文件系统已经关闭,则调用此方法无效。

      关闭文件系统将关闭所有打开的 channels directory-streams watch-service 以及与该文件系统关联的其他可关闭对象。无法关闭 default 文件系统。

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      抛出:
      IOException - 如果发生 I/O 错误
      UnsupportedOperationException - 在默认文件系统的情况下抛出
    • isOpen

      public abstract boolean isOpen()
      告知此文件系统是否打开。

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

      返回:
      true 当且仅当此文件系统打开时
    • isReadOnly

      public abstract boolean isReadOnly()
      告知此文件系统是否只允许对其文件存储进行只读访问。
      返回:
      true 当且仅当此文件系统提供只读访问时
    • getSeparator

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

      名称分隔符用于分隔路径字符串中的名称。一个实现可能支持多个名称分隔符,在这种情况下,此方法返回一个特定于实现的 default 名称分隔符。通过调用 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) 方法来检查对文件存储的 top-most 目录的读取访问。如果被拒绝,则迭代器不会返回文件存储。如果在获取迭代器时或在迭代期间完成权限检查,则取决于系统。

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

         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);
         }
       
      返回:
      迭代支持文件存储的对象
    • supportedFileAttributeViews

      public abstract Set <String > supportedFileAttributeViews()
      返回此 FileSystem 支持的文件属性视图的 names 的集合。

      BasicFileAttributeView 需要得到支持,因此该集合至少包含一个元素“basic”。

      supportsFileAttributeView(String) 方法可用于测试底层 FileStore 是否支持由文件属性视图标识的文件属性。

      返回:
      一组不可修改的受支持文件属性视图的名称
    • 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。如果 first 是空字符串并且 more 不包含任何非空字符串,则返回表示空路径的 Path

      路径对象的解析和转换本质上是依赖于实现的。在最简单的情况下,如果路径字符串包含无法转换为文件存储中legal字符的字符,则路径字符串将被拒绝并抛出InvalidPathException 。例如,在 UNIX 系统上,NUL (\u0000) 字符不允许出现在路径中。一个实现可以选择拒绝包含比任何文件存储所允许的名称长的名称的路径字符串,并且在一个实现支持复杂路径语法的地方,它可以选择拒绝 badly formed 的路径字符串。

      对于默认提供程序,路径字符串是根据平台或虚拟文件系统级别的路径定义来解析的。例如,操作系统可能不允许特定字符出现在文件名中,但特定的底层文件存储可能会对合法字符集施加不同或额外的限制。

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

      参数:
      first - 路径字符串或路径字符串的初始部分
      more - 要连接以形成路径字符串的附加字符串
      返回:
      结果Path
      抛出:
      InvalidPathException - 如果无法转换路径字符串
    • getPathMatcher

      public abstract PathMatcher  getPathMatcher(String  syntaxAndPattern)
      返回一个 PathMatcher,它通过解释给定的模式对 Path 对象的 String 表示执行匹配操作。 syntaxAndPattern 参数标识语法和模式并采用以下形式:
       syntax:pattern
       
      在哪里句法是语法的非空名称,pattern是一个可能为空的模式字符串,':' 代表它自己。

      FileSystem 实现支持“glob”和“regex”语法,并且可能支持其他语法。比较语法组件的值时不考虑大小写。

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

      模式语言
      示例 Description
      *.java 匹配表示以 .java 结尾的文件名的路径
      *.* 匹配包含点的文件名
      *.{java,class} 匹配以 .java.class 结尾的文件名
      foo.? 匹配以 foo. 和单个字符扩展名开头的文件名
      /home/*/* 在 UNIX 平台上匹配 /home/gus/data
      /home/** 在 UNIX 平台上匹配 /home/gus/home/gus/data
      C:\\* 在 Windows 平台上匹配 C:\fooC:\bar(注意反斜杠被转义;作为 Java 语言中的字符串文字,模式将是 "C:\\\\*"

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

      • * 字符与 name 组件的零个或多个 characters 匹配,而不跨越目录边界。

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

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

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

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

        在括号表达式中, *?\ 字符匹配自身。如果 (-) 字符是方括号内的第一个字符,或者如果取反,则匹配 ! 之后的第一个字符。

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

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

      • 所有其他字符以依赖于实现的方式匹配自身。这包括代表任何 name-separators 的字符。

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

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

      对于 glob 和 regex 语法,匹配细节(例如匹配是否区分大小写)取决于实现,因此未指定。

      参数:
      syntaxAndPattern - 语法和模式
      返回:
      可用于将路径与模式匹配的路径匹配器
      抛出:
      IllegalArgumentException - 如果参数不采用以下形式:syntax:pattern
      PatternSyntaxException - 如果模式无效
      UnsupportedOperationException - 如果实现不知道模式语法
      参见:
    • 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 (可选操作).

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

      返回:
      新的手表服务
      抛出:
      UnsupportedOperationException - 如果此 FileSystem 不支持监视文件系统对象的更改和事件。默认提供程序创建的 FileSystems 不会抛出此异常。
      IOException - 如果发生 I/O 错误