在 Java 中读取未知长度的 Gzip 文件

Reading a Gzip file of an Unknown length in Java

我需要从 s3 下载一个 .gz 格式的文件。 我可以很好地做到这一点

BufferedInputStream bufferedInputStream = new BufferedInputStream( new GZIPInputStream(fileObj.getObjectContent()));

现在,要读取此文件的内容,我可能需要做这样的事情

    int n;
    byte[] buffer = new byte[1024];
     while ((n = bufferedInputStream.read(buffer)) != -1) {
     }

但是我不知道原始 .gz 文件的大小。

可能会说我可能会从一些 API 的 aws-s3-sdk 中获取大小。 不过我还是觉得一定有更好的办法。

另外,我需要非常快地解压缩。我可以在 GZIPInputStream 上执行任何等效的并行流吗?

I have requirement to downlad a file from s3 which is in .gz format. I can very well do that

BufferedInputStream bufferedInputStream = new BufferedInputStream(new
GZIPInputStream(fileObj.getObjectContent()));

首先,所有 GZIPInputStream 都没有将文件内容作为构造函数参数,而是文件输入流 (like this)。

其次,您不一定需要 BufferedInputStream,因为您已经可以使用父 FileInputStream class.[=25= 的 GZIPInputStream.read(buffer[]) 方法缓冲您的输入]

第三,在阅读 Java 时,您需要知道 Gzip 文件(或任何其他文件)的大小。这正是 xxxInputStream 家族 class 的全部内容:您只需要知道从哪里开始阅读,但您不能不知道从哪里结束。

因此您的代码将如下所示:

    int megabytesCount = 10;
    try(GZIPInputStream gzipInputStream = new GZIPInputStream(yourFileInputStream))
    {
        bytes[] buffer = new bytes[megabytesCount * 1024];
        int bytesRead = -1;
        if(( bytesRead = gzipInputStream.read(buffer)) = -1)
        {
            // do Something with your buffer and its current size n; 
        }
    }catch(Expection blahBlah){

    }

bufferedInputStream class 将开始从您的文件块中读取最大 1024 字节的字节(您的缓冲区数组 buffer)。它可以读取小于最大值或恰好是最大值,你不知道。您所知道的是,从您的文件中读取的字节数将保存在您的变量 bytesRead 中。如果 bytesRead != -1 这意味着你已经从文件中读取了一些数据。只有当你到达 bytesRead == -1 时,你才知道你在文件的末尾。这就是为什么您不需要知道文件的实际大小的原因。只需打开 file/or 从 aws-s3 下载并开始阅读。

Also, I need to do this uncompression really fast. Is there any equivalent of Parallel Streaming which I can perform on GZIPInputStream?

Zipping/Unzipping 如果您知道设置缓冲区,使用 GZIPFileInputStream 的 *.gzip 文件应该足够快。例如,对于一个 1G(1000 * 1024 字节)的文件,megabytesCount = 10 你只能访问该文件 100 次。

如果你想移动得更快(如果你的记忆允许你的程序),那么做megabytesCount = 100,你的访问将只有10;

如果您必须一个接一个地访问您的数据,那么并行流在这里没有任何作用。