首页 > 解决方案 > BufferedReader 无法读取 Google Cloud Storage ReadChannel 上的所有行

问题描述

我正在下载一个 Google Cloud Storage 对象(一个大小约为 400MB、2500 万行记录的 GZIP 文件),代码如下:

Blob blob = storage.get(bucketName, blobName);
ReadChannel readChannel = blob.reader();

ReadChannel 被 gunzip 并通过以下方式传递给 BufferedReader:

BufferedReader reader = 
        new BufferedReader(
                new InputStreamReader(
                        new GZIPInputStream(
                                Channels.newInputStream(readChannel)),
                UTF_8));

问题:

BufferedReader 只会一直读取到 10110000 行(2500 万行中)(尝试 10 次以上)。

额外信息:

  1. 谷歌 ReadChannel 仍然是 endOfStream=false 。但是 BufferedReader 的 InputStreamReader 有 endOfFile=true。

  2. 我可以使用以下命令从完全相同的 ReadChannel 读取完整行(2500 万行):

InputStream inputStream = Channels.newInputStream(readChannel);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(500 * 1024 * 1024);
IOUtils.copy(inputStream, outputStream);
byte[] gzipFileBytes = outputStream.toByteArray();
BufferedReader reader = 
        new BufferedReader(
                new InputStreamReader(
                        new GZIPInputStream(
                                new ByteArrayInputStream(gzipFileBytes)),
                UTF_8));

非常感谢您的帮助。

标签: javagoogle-cloud-storagebufferedreadernio

解决方案


推荐阅读