指定されたサイズのチャンクで GCS blob の内容を読み取りたいと思います。GCS blob として保存された 10,000 バイトのファイルの最後の 5000 バイトを取得するテストを作成しました。ファイルは、1K の「0」、1K の「1」、1K の「2」、...、1K の「9」で構成されていました。
public void testDownloadBytes(Blob blob) throws IOException {
// 10K file - 1K of 0s, followed by 1K of 1s, 1K of 2s, ...
ReadChannel reader = blob.reader();
ByteBuffer byteBuf = ByteBuffer.allocate(10_000);
reader.seek(5000);
reader.setChunkSize(10_000);
int numRead = reader.read(byteBuf);
logger.info("read '" + numRead + " bytes");
byte[] bytes = byteBuf.array();
String s = new String(bytes, StandardCharsets.UTF_8);
logger.info("downloaded '" + s + "'");
}
バイト 5000 から開始し、10,000 バイトを取得するように要求したため、最後の 5000 バイトのみを読み取ることを期待していました。ただし、読み取られたバイト数は 10,000 でした。「5」から始まる最初の 5000 バイトは、私が予想していたものでした。興味深いのは、最後の 5000 バイトが <CR><LF> で構成され、その後にファイルの先頭(1K の "0"、...、998 個の "4") が続くことです。最後の 5000 バイトのみを取得するにはどうすればよいですか?