Open Chuckame opened 5 months ago
Could you use UnsafeCursor? https://square.github.io/okio/3.x/okio/okio/okio/-buffer/-unsafe-cursor/index.html
How to wrap the array using unsafe cursor? I only see a transfer method to still write bytes to the buffer.
Maybe by setting the bytes to data
?
You’d use this API to get a ByteArray that you can write bytes into. (That is only useful if the APIs you’re interacting with let you provide the target byte arrays.)
Ah ok, this is already ok for the encoding part.
I'm mainly talking about decoding data from a ByteArray
using BufferedSink
without copying the ByteArray
I would like something like BufferedSink.wrap(bytes)
@swankjesse do you have a solution for reading from a ByteArray
without copying ?
The problem is the the "Buffered" in BufferedSink
comes from its use of Buffer
to implement intermediate storage for higher-level APIs than a raw Sink
. And that Buffer
is exposed in the API, so you can't "just" wrap a ByteArray
with an index pointer or something.
Now looking at Buffer
, its backing ByteArray
s are held in Segment
s. We could probably implement something like Buffer.unsafeCreateFromByteArray
(or maybe on UnsafeCursor
so it's not on Buffer
) which took a ByteArray
and created a single Segment
with it whose shared
was set to true
to prevent it from going into the pool and owner
set to false
to prevent writing to it.
So it seems technically possible, and has the same relative guarantees as UnsafeCursor
usage. On the other hand, there's not a very high demand for this.
Context
I'm currently the maintainer of avro4k and I'm planning to use okio for kicking out java streams and hoping a day to be multiplatform.
A lot of apps/libs/frameworks are dealing only with
ByteArray
(I'm not saying it's a good idea though). On our side, in the avro world, and especially in the messaging world (kafka, rabbitmq, ...) everything is using aByteArray
and we have no room for improvement to useByteBuffer
or even okio'sBuffer
.We can encode easily data to a
Buffer
then reading the content to aByteArray
.But for decoding from a
ByteArray
, with okio, we only have to choice to first copy the content to aBuffer
and then decode, that is really bad regarding performances.By the way, we are not using directly
Buffer
butBufferedSink
andBufferedSource
for this really great encoding/decoding API, but sadly those interfaces aresealed
.Proposal
A constructor of
BufferedSource
that takes aByteArray
to allow reading "complex" values (readLongLe, readUtf8, ...) over aByteArray
Non goal
Backing a
Buffer
with aByteArray
: https://github.com/square/okio/issues/1360