On 08/08/2018 06:16, Luke Hutchison wrote:
The current ModuleReader API has methods list(), open(String name), and
read(String name). However, there is no way to get the length (file size)
of a resource short of opening or reading the whole resource, then
examining the number of bytes read or mapped. This can lead to unnecessary
resizing of arrays, and therefore unnecessary array copying.
Internally, the resource size is available in
ImageLocation#getUncompressedSize(). Can this be exposed as a size hint in
the ModuleReader API, e.g. in a method ModuleReader#getSizeHint(String
name) ?
The issue of exposing the resource size, in the context of the Module
API, was issue #ResourceExistenceAndSize in JSR 376. It was decided to
defer it as it wasn't critical for a first version.
If you are using the ModuleReader API then I assume you are doing
something that is scanning the module path (although your other mail
seems to be about resources in run-time image with compression so you
might be doing something else). If you need the size then one way to do
this is with:
int size = reader.read(name)
.map(bb -> {
int rem = bb.remaining();
reader.release(bb);
return rem;
}).orElseThrow(() -> new RuntimeException("not
found"));
When not using compression then this should be backed by a region from
the underlying file mapping. Yes, the compressed case is more expensive
but it's not the default.
-Alan