Module java.base
Package java.nio.file

Class FileSystem

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

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

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

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

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

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

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

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

自从:
1.7
  • Constructor Details

    • FileSystem

      protected FileSystem()
      初始化此类的新实例。
  • Method Details

    • provider

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

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

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

      关闭文件系统将关闭所有打开的 通道目录流监视服务 和其他与此文件系统关联的可关闭对象。 默认 文件系统无法关闭。

      指定者:
      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()
      返回名称分隔符,表示为字符串。 默认 名称分隔符。在通过调用 toString() 方法创建路径字符串时使用此分隔符。

      File.separator 相同的分隔符。

      返回:
      名称分隔符
    • getRootDirectories

      public abstract Iterable<Path> getRootDirectories()
      返回一个对象以迭代根目录的路径。

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

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

      必须支持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

      解析和转换为路径对象是固有地依赖于实现的。在最简单的情况下,如果路径字符串包含无法转换为文件存储中的合法字符的字符,则拒绝路径字符串,并抛出InvalidPathException。例如,在UNIX系统上,不允许NUL(\u0000)字符存在于路径中。实现可以选择拒绝包含比任何文件存储允许的更长的名称的路径字符串,并且如果实现支持复杂的路径语法,则可以选择拒绝格式错误的路径字符串。 在默认提供程序的情况下,路径字符串基于平台或虚拟文件系统级别的路径定义进行解析。例如,操作系统可能不允许特定字符存在于文件名中,但特定的底层文件存储可能对合法字符集施加不同或附加的限制。 此方法在路径字符串无法转换为路径时抛出InvalidPathException。在可能的情况下,并且适用时,异常将使用指示导致路径字符串被拒绝的path参数中的第一个位置的index值创建。

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

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

      FileSystem实现支持"glob"和"regex"语法,并可能支持其他语法。语法组件的值将不区分大小写进行比较。

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

      模式语言
      示例 描述
      *.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模式:

      • *字符匹配不跨越目录边界的字符的零个或多个名称组件。

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

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

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

      • [ ]字符是匹配名称组件中的一组字符中的单个字符的方括号表达式。例如,[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)方法来测试文件是否被视为隐藏。

      • 所有其他字符以实现相关的方式匹配自身。这包括表示任何名称分隔符的字符。

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

      当语法为"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错误