aQute.lib.io.ByteBufferOutputStream Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.bndtools.headless.build.plugin.gradle Show documentation
Show all versions of org.bndtools.headless.build.plugin.gradle Show documentation
org.bndtools.headless.build.plugin.gradle
The newest version!
package aQute.lib.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.Arrays;
public class ByteBufferOutputStream extends OutputStream {
private ByteBuffer bb;
public ByteBufferOutputStream() {
this(IOConstants.PAGE_SIZE);
}
public ByteBufferOutputStream(int size) {
bb = ByteBuffer.allocate(size);
}
public ByteBuffer toByteBuffer() {
return ByteBuffer.wrap(toByteArray());
}
public byte[] toByteArray() {
ByteBuffer obb = bb;
int offset = obb.arrayOffset();
return Arrays.copyOfRange(obb.array(), offset, offset + obb.position());
}
public ByteBufferOutputStream clear() {
bb.clear();
return this;
}
private ByteBuffer bb(int len) {
ByteBuffer obb = bb;
if (obb.remaining() - len >= 0) {
return obb;
}
int minCap = obb.position() + len;
int newCap = obb.capacity() << 1;
if ((newCap - minCap) < 0) {
newCap = minCap;
}
obb.flip();
return bb = ByteBuffer.allocate(newCap)
.put(obb);
}
@Override
public void write(int b) {
bb(Byte.BYTES).put((byte) b);
}
@Override
public void write(byte[] b) {
int len = b.length;
bb(len).put(b, 0, len);
}
@Override
public void write(byte[] b, int off, int len) {
bb(len).put(b, off, len);
}
public void write(ByteBuffer src) {
bb(src.remaining()).put(src);
}
public void write(InputStream in) throws IOException {
if (in instanceof ByteBufferInputStream bbin) {
write(bbin.buffer());
return;
}
ByteBuffer obb;
do {
obb = bb(in.available() + 1);
byte[] buffer = obb.array();
for (int size, position; obb.hasRemaining()
&& (size = in.read(buffer, position = obb.position(), obb.remaining())) > 0;) {
obb.position(position + size);
}
} while (!obb.hasRemaining());
}
@Override
public void flush() {}
@Override
public void close() {}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getName());
sb.append("[pos=");
sb.append(bb.position());
sb.append(" lim=");
sb.append(bb.limit());
sb.append(" cap=");
sb.append(bb.capacity());
sb.append("]");
return sb.toString();
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy