在 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;
如果您必须一个接一个地访问您的数据,那么并行流在这里没有任何作用。
我需要从 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;
如果您必须一个接一个地访问您的数据,那么并行流在这里没有任何作用。