-
- All Superinterfaces:
-
AutoCloseable
,Closeable
public interface ModuleReader extends Closeable
提供访问模块的内容。模块读取器适用于需要访问模块中的资源的情况,而不管模块是否已加载。 例如,扫描文件系统上的打包模块集合的框架可以使用模块读取器来访问每个模块中的特定资源。 模块读取器还旨在由从模块加载类和资源的
ClassLoader
实现使用。模块中的资源由抽象名称标识,它是“
/
” - 分离的路径字符串。 例如,模块java.base
可以具有资源“java/lang/Object.class
”,按照惯例,它是java.lang.Object
的类文件。 模块读取器可以将模块内容中的目录视为资源(无论是否具有模块读取器)。 其中模块内容包含可以被定位为资源的目录,则其名称以斜杠('/')结尾。 该目录也可以用一个名称来删除尾部斜杠。A
ModuleReader
创建时为open ,并通过调用close
方法关闭。 未能关闭模块阅读器可能会导致资源泄漏。try-with-resources
语句提供了一个有用的结构,以确保模块读取器关闭。A
ModuleReader
实现可能需要访问模块中的资源的权限。 因此,该find
,open
,read
,并list
方法可能抛出SecurityException
如果访问由安全管理器拒绝。- 实现要求:
-
将抽象资源名称转换为封装模块或文件系统中资源的位置时,
ModuleReader
实现应该格外小心。 实现建议的元素,如“对待资源名称.
,”..
”,包含文件分隔符,或空元素为元素‘未找到’。 更一般来说,如果资源名称不在list
方法返回的元素流中,则该资源应被视为“未找到”以避免不一致。 - 从以下版本开始:
- 9
- 另请参见:
-
ModuleReference
-
-
方法摘要
所有方法 接口方法 抽象方法 Default Methods Modifier and Type 方法 描述 void
close()
关闭模块阅读器。Optional<URI>
find(String name)
查找资源,将URI返回给模块中的资源。Stream<String>
list()
列出模块的内容,返回作为模块中所有资源名称的元素流。default Optional<InputStream>
open(String name)
打开资源,返回输入流以读取模块中的资源。default Optional<ByteBuffer>
read(String name)
读取资源,返回一个具有资源内容的字节缓冲区。default void
release(ByteBuffer bb)
释放一个字节缓冲区。
-
-
-
方法详细信息
-
find
Optional<URI> find(String name) throws IOException
查找资源,将URI返回给模块中的资源。如果模块读取器可以确定名称找到目录,则生成的URI将以斜杠('/')结尾。
- 参数
-
name
- 要打开阅读的资源的名称 - 结果
-
资源的URI;
如果找不到资源或者无法构造资源来定位资源,则为空
Optional
- 异常
-
IOException
- 如果发生I / O错误或模块读卡器关闭 -
SecurityException
- 如果安全管理员否认 - 另请参见:
-
ClassLoader.getResource(String)
-
open
default Optional<InputStream> open(String name) throws IOException
打开资源,返回输入流以读取模块中的资源。在模块读取器关闭之后使用输入流的行为是实现特定的,因此未指定。
- 实现要求:
-
默认实现调用
find
方法来获取资源的URI。 如果找到,那么它会尝试构建一个URL
并打开一个到该资源的连接。 - 参数
-
name
- 要打开阅读的资源的名称 - 结果
-
一个输入流读取资源或一个空的
Optional
如果没有找到 - 异常
-
IOException
- 如果发生I / O错误或模块读卡器关闭 -
SecurityException
- 如果安全经理否认
-
read
default Optional<ByteBuffer> read(String name) throws IOException
读取资源,返回一个具有资源内容的字节缓冲区。 返回缓冲区位置的元素是资源的第一个字节,缓冲区限制的元素是资源的最后一个字节。 一旦消费,必须调用release
方法。 未能调用release
方法可能会导致资源泄漏。- API Note:
-
此方法用于高性能类加载。
它不能(或打算)读取可能是2GB或更大的任意大的资源。
结合
release
方法使用此方法的release
是允许模块读取器实现以有效的方式管理缓冲区。 - 实现要求:
-
默认实现调用
open
方法,并将输入流中的所有字节读入字节缓冲区。 - 参数
-
name
- 要读取的资源的名称 - 结果
-
包含资源内容的字节缓冲区,如果未找到,
Optional
空Optional
- 异常
-
IOException
- 如果发生I / O错误或模块阅读器关闭 -
SecurityException
- 如果安全管理员否认 -
OutOfMemoryError
- 如果资源大于Integer.MAX_VALUE
,Integer.MAX_VALUE
字节缓冲区的最大容量 - 另请参见:
-
ClassLoader.defineClass(String, ByteBuffer, java.security.ProtectionDomain)
-
release
default void release(ByteBuffer bb)
释放一个字节缓冲区。 在消费read
方法返回的缓冲区的内容后,应调用此方法。 调用释放已经释放的缓冲区的方法的行为,或者在关闭ModuleReader
之后调用释放缓冲区的行为是实现特定的,因此未指定。- 实现要求:
- 默认的实现不会做任何事情,除非检查字节缓冲区是否为空。
- 参数
-
bb
- 要释放的字节缓冲区
-
list
Stream<String> list() throws IOException
列出模块的内容,返回作为模块中所有资源名称的元素流。 元素流是否包含与模块中的目录相对应的名称是具体的模块阅读器。在惰性实现中,当使用流列出模块内容时,可能会抛出一个
IOException
。 如果发生这种情况,那么IOException
将被包装在一个UncheckedIOException
中,并引发了导致尝试访问的方法。 当使用流来列出模块内容并且安全管理器拒绝访问时,也可能会抛出SecurityException
。在模块读取器关闭之后使用流的行为是实现特定的,因此未指定。
- 结果
- 作为模块中所有资源名称的元素流
- 异常
-
IOException
- 如果发生I / O错误或模块读卡器关闭 -
SecurityException
- 如果安全管理员否认
-
close
void close() throws IOException
关闭模块阅读器。 一旦关闭,则后续调用定位或读取资源将通过抛出IOException
失败。模块阅读器不需要异步关闭。 如果线程正在读取资源,而另一个线程调用close方法,则第二个线程可能会阻塞,直到读取操作完成。
- Specified by:
-
close
在接口AutoCloseable
- Specified by:
-
close
在接口Closeable
- 异常
-
IOException
- if an I/O error occurs
-
-