Module java.base
Package java.nio.file

Class FileSystems

java.lang.Object
java.nio.file.FileSystems

public final class FileSystems extends Object
文件系统的工厂方法。该类定义了getDefault方法来获取默认文件系统,并定义了用于构造其他类型文件系统的工厂方法。

对该类定义的任何方法的首次调用都会导致默认的provider被加载。默认提供程序由URI方案"file"标识,创建提供对Java虚拟机可访问的文件系统的FileSystem。如果加载或初始化默认提供程序的过程失败,则会抛出未指定的错误。

通过调用该类定义的任何newFileSystem方法的首次调用,通过调用installedProviders方法,会定位并加载所有已安装的文件系统提供程序。已安装的提供程序使用ServiceLoader类定义的服务提供程序加载工具加载。已安装的提供程序使用系统类加载器加载。如果找不到系统类加载器,则使用平台类加载器。通常通过将它们放置在应用程序类路径上的JAR文件中来安装提供程序,JAR文件包含一个名为java.nio.file.spi.FileSystemProvider的提供程序配置文件,位于资源目录META-INF/services中,并且文件列出了一个或多个具有零参数构造函数的FileSystemProvider的完全限定名称的子类。已安装的提供程序的定位顺序是特定于实现的。如果实例化提供程序并且其getScheme返回与先前实例化的提供程序的URI方案相同,则最近实例化的重复项将被丢弃。URI方案的比较不考虑大小写。在构造期间,提供程序可以安全地访问与默认提供程序关联的文件,但需要注意避免循环加载其他已安装的提供程序。如果检测到已安装的提供程序的循环加载,则会抛出未指定的错误。

该类还定义了工厂方法,允许在定位提供程序时指定ClassLoader。与已安装的提供程序一样,通过将提供程序配置文件放置在资源目录META-INF/services中来识别提供程序类。

如果一个线程启动了已安装文件系统提供程序的加载,另一个线程调用了一个也尝试加载提供程序的方法,则该方法将阻塞,直到加载完成。

自版本:
1.7
  • Method Details

    • getDefault

      public static FileSystem getDefault()
      返回默认的FileSystem。默认文件系统创建提供对Java虚拟机可访问的文件系统的对象。文件系统的工作目录是当前用户目录,由系统属性user.dir命名。这允许与java.io.File类进行互操作。

      对该类定义的任何方法的首次调用都会定位默认的provider对象。如果未定义系统属性java.nio.file.spi.DefaultFileSystemProvider,则默认提供程序是一个系统默认提供程序,用于创建默认文件系统。

      如果定义了系统属性java.nio.file.spi.DefaultFileSystemProvider,则它被视为一个由URI方案"file"标识的一个或多个具体提供程序类的完全限定名称列表。如果属性是一个包含多个名称的列表,则名称之间用逗号分隔。每个类都通过使用系统类加载器加载,并通过调用一个形式参数类型为FileSystemProvider的单参数构造函数进行实例化。提供程序按照它们在属性中列出的顺序加载和实例化。如果此过程失败或提供程序的方案不等于"file",则会抛出未指定的错误。通常,URI方案是不考虑大小写进行比较的,但对于默认提供程序,方案必须是"file"。第一个提供程序类通过使用对系统默认提供程序的引用来实例化。第二个提供程序类通过使用对第一个提供程序实例的引用来实例化。第三个提供程序类通过使用对第二个实例的引用来实例化,依此类推。最后一个被实例化的提供程序成为默认提供程序;它的getFileSystem方法通过URI"file:///"被调用以获取对默认文件系统的引用。

      对此方法的后续调用将返回第一次调用时返回的文件系统。

      返回:
      默认文件系统
    • getFileSystem

      public static FileSystem getFileSystem(URI uri)
      返回对现有FileSystem的引用。

      此方法遍历installed提供程序,以定位由给定URI的URIscheme标识的提供程序。URI方案是不考虑大小写进行比较的。URI的确切形式高度依赖于提供程序。如果找到,则调用提供程序的getFileSystem方法以获取对FileSystem的引用。

      一旦由该提供程序创建的文件系统被closed,则如果此方法返回对已关闭文件系统的引用或抛出FileSystemNotFoundException,则取决于提供程序。如果提供程序允许使用与其先前创建的文件系统相同的URI创建新文件系统,则在关闭文件系统后(并在newFileSystem方法创建新实例之前)调用此方法会抛出异常。

      如果安装了安全管理器,则提供程序实现可能需要在返回对现有文件系统的引用之前检查权限。对于default文件系统,不需要进行权限检查。

      参数:
      uri - 用于定位文件系统的URI
      返回:
      对文件系统的引用
      抛出:
      IllegalArgumentException - 如果未满足uri参数的前提条件
      FileSystemNotFoundException - 如果由URI标识的文件系统不存在
      ProviderNotFoundException - 如果未安装支持URI方案的提供程序
      SecurityException - 如果安装了安全管理器并且拒绝了未指定的权限
    • newFileSystem

      public static FileSystem newFileSystem(URI uri, Map<String,?> env) throws IOException
      构造由URI标识的新文件系统

      此方法遍历installed提供程序,以定位由给定URI的URIscheme标识的提供程序。URI方案是不考虑大小写进行比较的。URI的确切形式高度依赖于提供程序。如果找到,则调用提供程序的newFileSystem(URI,Map)方法以构造新文件系统。

      一旦文件系统被closed,则如果提供程序允许使用与其先前创建的文件系统相同的URI创建新文件系统,则取决于提供程序。

      使用示例:假设已安装了一个由方案"memory"标识的提供程序:

          FileSystem fs = FileSystems.newFileSystem(URI.create("memory:///?name=logfs"),
                                                    Map.of("capacity", "16G", "blockSize", "4k"));
      
      参数:
      uri - 标识文件系统的URI
      env - 用于配置文件系统的特定于提供程序的属性映射;可能为空
      返回:
      一个新的文件系统
      抛出:
      IllegalArgumentException - 如果未满足uri参数的前提条件,或者env参数不包含提供程序所需的属性,或者属性值无效
      FileSystemAlreadyExistsException - 如果文件系统已经创建
      ProviderNotFoundException - 如果未安装支持URI方案的提供程序
      IOException - 如果创建文件系统时发生I/O错误
      SecurityException - 如果安装了安全管理器并且拒绝文件系统提供程序实现所需的未指定权限
    • newFileSystem

      public static FileSystem newFileSystem(URI uri, Map<String,?> env, ClassLoader loader) throws IOException
      构造一个由URI标识的新文件系统

      此方法首先尝试以与newFileSystem(URI,Map)方法完全相同的方式定位已安装的提供程序。如果没有安装的提供程序支持URI方案,则尝试使用给定的类加载器定位提供程序。如果找到支持URI方案的提供程序,则调用其newFileSystem(URI,Map)来构造新文件系统。

      参数:
      uri - 标识文件系统的URI
      env - 用于配置文件系统的特定于提供程序的属性映射;可能为空
      loader - 用于定位提供程序的类加载器,或null以仅尝试定位已安装的提供程序
      返回:
      一个新的文件系统
      抛出:
      IllegalArgumentException - 如果未满足uri参数的前提条件,或者env参数不包含提供程序所需的属性,或者属性值无效
      FileSystemAlreadyExistsException - 如果URI方案标识已安装提供程序且文件系统已创建
      ProviderNotFoundException - 如果找不到支持URI方案的提供程序
      ServiceConfigurationError - 在加载服务提供程序时发生错误
      IOException - 创建文件系统时发生I/O错误
      SecurityException - 如果安装了安全管理器并且拒绝文件系统提供程序实现所需的未指定权限
    • newFileSystem

      public static FileSystem newFileSystem(Path path, ClassLoader loader) throws IOException
      构造一个新的FileSystem以访问文件的内容作为文件系统。

      此方法利用专门的提供程序创建伪文件系统,其中一个或多个文件的内容被视为文件系统。

      此方法首先尝试以与newFileSystem(Path, Map, ClassLoader)方法完全相同的方式定位已安装的提供程序,使用空映射。如果没有安装的提供程序返回FileSystem,则尝试使用给定的类加载器定位提供程序。如果提供程序返回文件系统,则查找终止并返回文件系统。

      参数:
      path - 文件的路径
      loader - 用于定位提供程序的类加载器,或null以仅尝试定位已安装的提供程序
      返回:
      一个新的文件系统
      抛出:
      ProviderNotFoundException - 如果找不到支持此文件类型的提供程序
      ServiceConfigurationError - 在加载服务提供程序时发生错误
      IOException - 如果发生I/O错误
      SecurityException - 如果安装了安全管理器并且拒绝未指定权限
    • newFileSystem

      public static FileSystem newFileSystem(Path path, Map<String,?> env) throws IOException
      构造一个新的FileSystem以访问文件的内容作为文件系统。

      此方法利用专门的提供程序创建伪文件系统,其中一个或多个文件的内容被视为文件系统。

      此方法首先尝试以与newFileSystem(Path, Map, ClassLoader)方法完全相同的方式定位已安装的提供程序。如果找到,将调用提供程序的newFileSystem(Path, Map)方法来构造新文件系统。

      参数:
      path - 文件的路径
      env - 用于配置文件系统的特定于提供程序的属性映射;可能为空
      返回:
      一个新的文件系统
      抛出:
      ProviderNotFoundException - 如果找不到支持此文件类型的提供程序
      ServiceConfigurationError - 在加载服务提供程序时发生错误
      IOException - 如果发生I/O错误
      SecurityException - 如果安装了安全管理器并且拒绝未指定权限
      自:
      13
    • newFileSystem

      public static FileSystem newFileSystem(Path path) throws IOException
      构造一个新的FileSystem以访问文件的内容作为文件系统。

      此方法利用专门的提供程序创建伪文件系统,其中一个或多个文件的内容被视为文件系统。

      此方法首先尝试以与newFileSystem(Path, Map, ClassLoader)方法完全相同的方式定位已安装的提供程序。如果找到,将调用提供程序的newFileSystem(Path, Map)方法,使用空映射来构造新文件系统。

      参数:
      path - 文件的路径
      返回:
      一个新的文件系统
      抛出:
      ProviderNotFoundException - 如果找不到支持此文件类型的提供程序
      ServiceConfigurationError - 在加载服务提供程序时发生错误
      IOException - 如果发生I/O错误
      SecurityException - 如果安装了安全管理器并且拒绝未指定权限
      自:
      13
    • newFileSystem

      public static FileSystem newFileSystem(Path path, Map<String,?> env, ClassLoader loader) throws IOException
      构造一个新的FileSystem以访问文件的内容作为文件系统。

      此方法利用专门的提供程序创建伪文件系统,其中一个或多个文件的内容被视为文件系统。

      此方法迭代installed提供程序。依次调用每个提供程序的newFileSystem(Path,Map)方法。如果提供程序返回文件系统,则迭代终止并返回文件系统。如果没有安装的提供程序返回FileSystem,则尝试使用给定的类加载器定位提供程序。如果提供程序返回文件系统,则查找终止并返回文件系统。

      参数:
      path - 文件的路径
      env - 用于配置文件系统的特定于提供程序的属性映射;可能为空
      loader - 用于定位提供程序的类加载器,或null以仅尝试定位已安装的提供程序
      返回:
      一个新的文件系统
      抛出:
      ProviderNotFoundException - 如果找不到支持此文件类型的提供程序
      ServiceConfigurationError - 在加载服务提供程序时发生错误
      IOException - 如果发生I/O错误
      SecurityException - 如果安装了安全管理器并且拒绝未指定权限
      自:
      13