Module  java.base
软件包  java.lang.module

Interface ModuleReader

  • All Superinterfaces:
    AutoCloseableCloseable


    public interface ModuleReader
    extends Closeable
    提供访问模块的内容。

    模块读取器适用于需要访问模块中的资源的情况,而不管模块是否已加载。 例如,扫描文件系统上的打包模块集合的框架可以使用模块读取器来访问每个模块中的特定资源。 模块读取器还旨在由从模块加载类和资源的ClassLoader实现使用。

    模块中的资源由抽象名称标识,它是“ / ” - 分离的路径字符串。 例如,模块java.base可以具有资源“ java/lang/Object.class ”,按照惯例,它是java.lang.Object的类文件。 模块读取器可以将模块内容中的目录视为资源(无论是否具有模块读取器)。 其中模块内容包含可以被定位为资源的目录,则其名称以斜杠('/')结尾。 该目录也可以用一个名称来删除尾部斜杠。

    A ModuleReader创建时为open ,并通过调用close方法关闭。 未能关闭模块阅读器可能会导致资源泄漏。 try-with-resources语句提供了一个有用的结构,以确保模块读取器关闭。

    A ModuleReader实现可能需要访问模块中的资源的权限。 因此,该findopenread ,并list方法可能抛出SecurityException如果访问由安全管理器拒绝。

    实现要求:
    将抽象资源名称转换为封装模块或文件系统中资源的位置时, ModuleReader实现应该格外小心。 实现建议的元素,如“对待资源名称. ,” .. ”,包含文件分隔符,或空元素为元素‘未找到’。 更一般来说,如果资源名称不在list方法返回的元素流中,则该资源应被视为“未找到”以避免不一致。
    从以下版本开始:
    9
    另请参见:
    ModuleReference
    • 方法详细信息

      • 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 - 要读取的资源的名称
        结果
        包含资源内容的字节缓冲区,如果未找到, OptionalOptional
        异常
        IOException - 如果发生I / O错误或模块阅读器关闭
        SecurityException - 如果安全管理员否认
        OutOfMemoryError - 如果资源大于 Integer.MAX_VALUEInteger.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