diff --git a/gcp/src/main/java/org/apache/iceberg/gcp/gcs/GCSInputStream.java b/gcp/src/main/java/org/apache/iceberg/gcp/gcs/GCSInputStream.java index d8b092e4e70a..fc09bafadbc8 100644 --- a/gcp/src/main/java/org/apache/iceberg/gcp/gcs/GCSInputStream.java +++ b/gcp/src/main/java/org/apache/iceberg/gcp/gcs/GCSInputStream.java @@ -117,7 +117,7 @@ public int read() throws IOException { readBytes.increment(); readOperations.increment(); - return singleByteBuffer.array()[0]; + return singleByteBuffer.array()[0] & 0xFF; } @Override diff --git a/gcp/src/test/java/org/apache/iceberg/gcp/gcs/GCSInputStreamTest.java b/gcp/src/test/java/org/apache/iceberg/gcp/gcs/GCSInputStreamTest.java index 1a5200345b7a..733d9101869b 100644 --- a/gcp/src/test/java/org/apache/iceberg/gcp/gcs/GCSInputStreamTest.java +++ b/gcp/src/test/java/org/apache/iceberg/gcp/gcs/GCSInputStreamTest.java @@ -78,6 +78,22 @@ public void testRead() throws Exception { } } + @Test + public void testReadSingle() throws Exception { + BlobId uri = BlobId.fromGsUtilUri("gs://bucket/path/to/read.dat"); + int i0 = 1; + int i1 = 255; + byte[] data = {(byte) i0, (byte) i1}; + + writeGCSData(uri, data); + + try (SeekableInputStream in = + new GCSInputStream(storage, uri, gcpProperties, MetricsContext.nullMetrics())) { + assertThat(in.read()).isEqualTo(i0); + assertThat(in.read()).isEqualTo(i1); + } + } + private void readAndCheck( SeekableInputStream in, long rangeStart, int size, byte[] original, boolean buffered) throws IOException {