AutoCloseable
, Closeable
public interface ModuleReader extends Closeable
A module reader is intended for cases where access to the resources in a
module is required, regardless of whether the module has been loaded.
A framework that scans a collection of packaged modules on the file system,
for example, may use a module reader to access a specific resource in each
module. A module reader is also intended to be used by ClassLoader
implementations that load classes and resources from modules.
A resource in a module is identified by an abstract name that is a
'/
'-separated path string. For example, module java.base
may
have a resource "java/lang/Object.class
" that, by convention, is the
class file for java.lang.Object
. A module reader may treat
directories in the module content as resources (whether it does or not is
module reader specific). Where the module content contains a directory
that can be located as a resource then its name ends with a slash ('/'). The
directory can also be located with a name that drops the trailing slash.
A ModuleReader
is open upon
creation and is closed by invoking the close
method. Failure
to close a module reader may result in a resource leak. The
try-with-resources
statement provides a useful construct to ensure that
module readers are closed.
A ModuleReader
implementation may require permissions to access
resources in the module. Consequently the find
, open
, read
, and list
methods may throw
SecurityException
if access is denied by the security manager.
ModuleReader
should take great care
when translating an abstract resource name to the location of a resource in
a packaged module or on the file system. Implementations are advised to
treat resource names with elements such as '.
, '..
',
elements containing file separators, or empty elements as "not found". More
generally, if the resource name is not in the stream of elements that the
list
method returns then the resource should be treated as "not
found" to avoid inconsistencies.ModuleReference
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
Closes the module reader.
|
Optional<URI> |
find(String name) |
Finds a resource, returning a URI to the resource in the module.
|
Stream<String> |
list() |
Lists the contents of the module, returning a stream of elements that
are the names of all resources in the module.
|
default Optional<InputStream> |
open(String name) |
Opens a resource, returning an input stream to read the resource in
the module.
|
default Optional<ByteBuffer> |
read(String name) |
Reads a resource, returning a byte buffer with the contents of the
resource.
|
default void |
release(ByteBuffer bb) |
Release a byte buffer.
|
Optional<URI> find(String name) throws IOException
If the module reader can determine that the name locates a directory then the resulting URI will end with a slash ('/').
name
- The name of the resource to open for readingOptional
if the resource
is not found or a URI cannot be constructed to locate the
resourceIOException
- If an I/O error occurs or the module reader is closedSecurityException
- If denied by the security managerClassLoader.getResource(String)
default Optional<InputStream> open(String name) throws IOException
The behavior of the input stream when used after the module reader is closed is implementation specific and therefore not specified.
find
method to get a URI to the resource. If found, then it attempts
to construct a URL
and open a connection to the
resource.name
- The name of the resource to open for readingOptional
if not foundIOException
- If an I/O error occurs or the module reader is closedSecurityException
- If denied by the security managerdefault Optional<ByteBuffer> read(String name) throws IOException
release
method
must be invoked. Failure to invoke the release
method may result
in a resource leak.release
method is to allow module reader
implementations manage buffers in an efficient manner.open
method and reads all bytes from the input stream into a byte
buffer.name
- The name of the resource to readOptional
if not foundIOException
- If an I/O error occurs or the module reader is closedSecurityException
- If denied by the security managerOutOfMemoryError
- If the resource is larger than Integer.MAX_VALUE
,
the maximum capacity of a byte bufferClassLoader.defineClass(String, ByteBuffer, java.security.ProtectionDomain)
default void release(ByteBuffer bb)
read
method.
The behavior of this method when invoked to release a buffer that has
already been released, or the behavior when invoked to release a buffer
after a ModuleReader
is closed is implementation specific and
therefore not specified.bb
- The byte buffer to releaseStream<String> list() throws IOException
In lazy implementations then an IOException
may be thrown
when using the stream to list the module contents. If this occurs then
the IOException
will be wrapped in an UncheckedIOException
and thrown from the method that caused the
access to be attempted. SecurityException
may also be thrown
when using the stream to list the module contents and access is denied
by the security manager.
The behavior of the stream when used after the module reader is closed is implementation specific and therefore not specified.
IOException
- If an I/O error occurs or the module reader is closedSecurityException
- If denied by the security managervoid close() throws IOException
IOException
.
A module reader is not required to be asynchronously closeable. If a thread is reading a resource and another thread invokes the close method, then the second thread may block until the read operation is complete.
close
in interface AutoCloseable
close
in interface Closeable
IOException
- if an I/O error occursCopyright © 1993, 2017, Oracle and/or its affiliates · All rights reserved · License