Java路径如何转换为例如InputStream

问题描述 投票:1回答:1

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

java file path nio
1个回答
3
投票

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类中的方法时,它将使用PathPath方法委派给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的文件系统进行通信)。

© www.soinside.com 2019 - 2024. All rights reserved.