gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:30:47 26 4
gpt4 key购买 nike

我需要从 s3 下载 .gz 格式的文件。我完全可以做到

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

现在,要读取该文件的内容,我可能需要执行类似的操作

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

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

可能会说我可能会从 aws-s3-sdk 的某些 API 中获取大小。但我仍然认为一定有更好的方法。

此外,我需要非常快地进行解压缩。我可以在 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,因为您已经可以使用 GZIPInputStream.read(buffer[]) 缓冲输入。方法父 FileInputStream 类。

第三,在 Java 中读取 Gzip 文件(或任何其他文件)时,您需要知道它的大小。这正是 xxxInputStream 系列类的全部内容:您只需要知道从哪里开始阅读,但一定不知道从哪里结束。

所以你的代码将如下所示:

    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 类将开始从文件中读取最大 1024 字节的字节 block (您的缓冲区数组 buffer)。它可以读取小于最大值或恰好是最大值,你不知道。您所知道的是,从文件中读取的字节量将保存在变量 bytesRead 中。如果 bytesRead != -1 则表示您已从文件中读取了一些数据。仅当您达到 bytesRead == -1 时,您才知道您已到达文件末尾。这就是为什么您不需要知道文件的实际大小。只需打开文件/或从 aws-s3 下载文件并开始阅读即可。

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

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

如果你想移动得更快(并且如果你的内存允许你的程序),那么执行megabytesCount = 100,你的访问权限将只有10;

如果您必须一个接一个地访问数据,那么并行流不会带来任何影响。

关于java - 在Java中读取未知长度的Gzip文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49309074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com