[JDK-6341887] Patch: java.util.zip: Add ByteBuffer methods to Inflater/Deflater
Xueming Shen
xueming.shen at oracle.com
Sat Feb 17 21:18:29 UTC 2018
On 2/16/18, 2:13 PM, David Lloyd wrote:
> It would be convenient to be able to inflate/deflate a direct or heap
> byte buffer without having to copy it through an array first. For my
> Friday mini-project this week, I've decided to take a crack at this.
> The attached patch is the result. Would anyone be interested in
> reviewing and maybe sponsoring this change? It would be really great
> to get it in to JDK 11.
>
> The patch includes a modification to FlaterTest to run through
> permutations of using direct and heap byte buffers. Though I couldn't
> get jtreg working, I did compile and run the test by hand and it seems
> to pass; the build also works fine with the new code.
>
> Extra thanks to Martin Balao for pointing me towards mapfile-vers when
> I couldn't figure out why I was getting UnsatisfiedLinkError. That
> one was not obvious.
Hi David,
Thanks for taking this one :-) some comments here.
(1) I would assume you might have to do more for ByteBuffer, something like
if (bf.isDirect()) {
// GetDirectBufferAddress
...
} else if (bf.hasArray()) {
byte[] array = bf.getArray();
do(bf.getArray(), offset + pos, pos - limit);
...
} else {
// probably still have to copy the bytes out of ByteBuffer
...
}
btw, any reason go unsafe to get the byte[]? instead of
ByteBuffer.getArray()?
(2) It might be a concerned that you have to warp the input byte[] every
time
the inflate/deflate(byte[]...) is called. (Yes, I'm constantly
hearing people
complain that you have to wrap the byte[] to ByteBuffer to use
CharsetEn/
Decoder, or even the implementation detail inside StringCoder),
and it might
be taken as a "regression". So it might be desired to wire the
"bf.hasArray())
path inside de/encode(ByteArray) back to de/encode(byte[], int,
int), to avoid
the "unnecessary" ByteBuffer wrap.
(3) Same "wrap concern" argument might go to the setInput(bye[] ...) as
well.
I'm not sure if it is worth keeping both byte[]/int/int and
ByteBuffer as the
"input" field of In/Deflater.
(4) assume we keep the "wrap" approach. It appears ByteBuffer.wrap()
does check
the byte[]/off/len and throw an IndexOutOfBoundsException. So it
might be
better to take advantage of that check.
(5) Deflater.input need to be initialized to a non-null value.
Btw ZipUtil.defaultBuf needs to be "direct"?
(6) It might be desired to have some jmh measure to make sure byte[]
case does
not have regression.
Thanks,
Sherman
More information about the core-libs-dev
mailing list