java.nio.Files类具有一个名为Files#newInputStream的静态方法,该方法将Path实例作为输入,并返回InputStream作为输出。但是我不清楚在不实例化File(InputStream)对象的情况下如何做到这一点。我希望能够实现自己的Path实现,该实现可以指向与File对象无关的InputStream。我想这样做,以便可以制作一个虚拟文件系统,该文件系统使用文件系统的符号而不实际依赖于文件系统。这可能吗?
Java NIO文件系统API使用委托和抽象工厂模式。在最低级别执行java.nio.file.spi.FileSystemProvider
:
文件系统的服务提供者类。
java.nio.file.spi.FileSystemProvider
类定义的方法通常将委派给该类的实例。 [添加了重点]
Files
提供了Files
的实例:
提供文件系统的接口,是对象访问文件和文件系统中其他对象的工厂。
通过调用
FileSystemProvider
方法获得的默认文件系统,提供对Java虚拟机可访问的文件系统的访问。java.nio.file.FileSystem
类定义用于创建文件系统的方法,这些文件系统提供对其他类型的(自定义)文件系统的访问。文件系统是用于几种类型的对象的工厂: [添加了重点]
java.nio.file.FileSystem
方法转换系统相关的路径字符串,返回可用于查找和访问文件的FileSystems.getDefault
对象。
FileSystems
方法用于创建在路径上执行匹配操作的getPath
。
Path
方法在基础文件存储上返回迭代器。
getPathMatcher
方法将PathMatcher
返回到按名称查找用户或组。
getFileStores
方法创建一个getUserPrincipalLookupService
,可用于监视对象的更改和事件。
然后有UserPrincipalLookupService
界面:
可用于在文件系统中定位文件的对象。它通常代表系统相关的文件路径。
请注意,newWatchService
只是一条路径。它不一定代表实际的文件,而仅代表文件的路径(无论它是否存在)。在这方面,它类似于WatchService
。
当您调用Path
类中的方法时,它将使用Path
和Path
方法委派给java.io.File
。该API设计允许开发人员以透明的方式将Files
类与Path#getFileSystem()
的任何实现一起使用。对于开发人员how而言,Path#getFileSystem()
的创建无关紧要,只是FileSystem#provider()
is的创建与API合同的方式无关。
方法FileSystem#provider()
和FileSystemProvider
委托给Files
创建Path
的实例。当将这些InputStream
实例与InputStream
中的方法一起使用时,最终将访问主机平台的基础文件系统。
如果要创建虚拟文件系统,则需要实现Paths#get(String,String...)
以及所有相关的抽象类和接口,例如Paths#get(String,String...)
和Path#of(String,String...)
。请注意,某些API是“可选的”。如果您的实现不提供可选的API,则可以抛出Path#of(String,String...)
。各种类/方法的Javadoc提供了更多信息。
就是说,已经有一个内存中文件系统实现:default file system
“ 但是我不清楚在不实例化File(InputStream)的情况下如何完成此操作”。 NIO文件API与Path
不相关。如果您想了解它的功能,可以查看源代码。您的JDK应该附带一个Path
文件,其中包含Java源文件。但是,它将仅包含您主机操作系统的实现,并且将不包含任何本机代码(默认文件系统最终将使用本机代码与底层OS的文件系统进行通信)。