ChunkedStream
@Override
public boolean isEndOfInput() throws Exception {
if (closed) {
return true;
}
int b = in.read();
if (b < 0) {
return true;
} else {
in.unread(b);
return false;
}
}
@Override
public ByteBuf readChunk(ByteBufAllocator allocator) throws Exception {
if (isEndOfInput()) {
return null;
}
final int availableBytes = in.available();
final int chunkSize;
if (availableBytes <= 0) {
chunkSize = this.chunkSize;
} else {
chunkSize = Math.min(this.chunkSize, in.available());
}
boolean release = true;
ByteBuf buffer = allocator.buffer(chunkSize);
try {
// transfer to buffer
offset += buffer.writeBytes(in, chunkSize);
release = false;
return buffer;
} finally {
if (release) {
buffer.release();
}
}
}
ChunkedFile
@Override
public boolean isEndOfInput() throws Exception {
return !(offset < endOffset && file.getChannel().isOpen());
}
@Override
public ByteBuf readChunk(ByteBufAllocator allocator) throws Exception {
long offset = this.offset;
if (offset >= endOffset) {
return null;
}
int chunkSize = (int) Math.min(this.chunkSize, endOffset - offset);
// Check if the buffer is backed by an byte array. If so we can optimize it a bit an safe a copy
ByteBuf buf = allocator.heapBuffer(chunkSize);
boolean release = true;
try {
file.readFully(buf.array(), buf.arrayOffset(), chunkSize);
buf.writerIndex(chunkSize);
this.offset = offset + chunkSize;
release = false;
return buf;
} finally {
if (release) {
buf.release();
}
}
}