Java Path 如何转换为例如InputStream

Bir*_*die 7 java nio file path

java.nio.Files 类有一个名为 Files#newInputStream 的静态方法,该方法将 Path 实例作为输入并返回 InputStream 作为输出。但我不清楚如何在不实例化 File(InputStream) 对象的情况下完成此操作。我希望能够自己实现 Path ,它可以指向与 File 对象无关的 InputStream 。我想这样做,以便我可以创建一个使用文件系统符号的虚拟文件系统,而不实际依赖于文件系统。这可能吗?

Sla*_*law 5

Java NIO 文件系统 API 使用委托和抽象工厂模式。在最低级别有以下实现java.nio.file.spi.FileSystemProvider

文件系统的服务提供者类。类定义的方法Files通常会委托给此类的实例。 [强调]

AFileSystemProvider提供了以下实例java.nio.file.FileSystem

提供文件系统的接口,是对象访问文件系统中的文件和其他对象的工厂。

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

文件系统是多种类型对象的工厂: [强调]

  • getPath方法转换系统相关路径字符串,返回Path可用于定位和访问文件的对象。

  • getPathMatcher方法用于创建PathMatcher对路径执行匹配操作的 。

  • getFileStores方法返回底层文件存储上的迭代器。

  • getUserPrincipalLookupService方法返回按UserPrincipalLookupService名称查找用户或组。

  • newWatchService方法创建WatchService可用于监视对象的更改和事件的 。

然后是Path界面:

可用于在文件系统中定位文件的对象。它通常代表系统相关的文件路径。

请注意,aPath只是一条路径。它不一定代表实际的文件,仅代表文件的路径(无论存在与否)。在这方面与此类似java.io.File

当您调用Files类中的方法时,它使用Path#getFileSystem()FileSystem#provider()方法委托给FileSystemProvider. 这种 API 设计允许开发人员以透明的方式使用具有任何实现Files类。对于开发人员来说,如何创建它并不重要,只要以符合 API 契约的方式创建即可PathInputStreamInputStream

该方法Paths#get(String,String...)Path#of(String,String...)委托给默认文件系统来创建Path. 当您将这些Path实例与中的方法一起使用时Files,您最终将访问主机平台的底层文件系统。

如果您想创建一个虚拟文件系统,那么您需要实现FileSystemProvider以及所有相关的抽象类和接口,例如FileSystemPath。但请注意,某些 API 是“可选的”。如果您的实现不提供可选的 API,那么您可以抛出一个UnsupportedOperationException. 各种类/方法的 Javadoc 提供了更多信息。

也就是说,已经有一个内存文件系统实现: https: //github.com/google/jimfs


但我不清楚如何在不实例化 File(InputStream) 的情况下完成此操作”。NIO 文件 API 与java.io.File. 如果你想了解它是如何做的,你可以查看源代码。您的 JDK 应该附带一个src.zip包含 Java 源文件的文件;但是,它仅包含主机操作系统的实现,而不会包含任何本机代码(默认文件系统最终使用本机代码与底层操作系统的文件系统进行通信)。