Java - 读取 BZ2 文件并即时解压缩/解析
Posted
技术标签:
【中文标题】Java - 读取 BZ2 文件并即时解压缩/解析【英文标题】:Java - Read BZ2 file and uncompress/parse on the fly 【发布时间】:2011-06-17 14:38:05 【问题描述】:我有一个相当大的 BZ2 文件,其中包含多个文本文件。我是否可以使用 Java 解压缩 BZ2 文件中的某些文件并即时解压缩/解析数据?假设一个 300mb 的 BZ2 文件包含 1GB 的文本。理想情况下,我希望我的 java 程序读取 1 mb 的 BZ2 文件,即时解压缩,执行操作并继续读取 BZ2 文件以获取更多数据。这可能吗?
谢谢
【问题讨论】:
请注意,bzip2/bz2 文件是压缩的单个文件。它们不是可以包含多个文件(或目录)的档案,例如 zip 或其他格式。 【参考方案1】:来自 apache 的 commons-compress 库非常好。这是他们的示例页面: http://commons.apache.org/proper/commons-compress/examples.html
这是最新的 maven sn-p:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.10</version>
</dependency>
这是我的 util 方法:
public static BufferedReader getBufferedReaderForCompressedFile(String fileIn) throws FileNotFoundException, CompressorException
FileInputStream fin = new FileInputStream(fileIn);
BufferedInputStream bis = new BufferedInputStream(fin);
CompressorInputStream input = new CompressorStreamFactory().createCompressorInputStream(bis);
BufferedReader br2 = new BufferedReader(new InputStreamReader(input));
return br2;
【讨论】:
注意:可接受的格式有:gzip、bzip2、xz、lzma、Pack200、DEFLATE 和 Z。如链接所示,自动分配正确的格式【参考方案2】:Ant 项目包含一个bzip2 库。其中有一个org.apache.tools.bzip2.CBZip2InputStream
类。您可以使用此类即时解压缩 bzip2 文件 - 它只是扩展了标准 Java InputStream
类。
【讨论】:
这个库无法识别我的 bzip2 格式。必须使用 commons-compress。【参考方案3】:您可以使用来自 Apache commons-compress 的 org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream
InputStream inputStream = new BZip2CompressorInputStream(new FileInputStream(xmlBz2File), true) // true should be used for big files, as I understand
比org.apache.commons.compress.utils.IOUtils
:
int pos = 0;
int step = 1024 * 32;
byte[] buffer = new byte[step];
int actualLength = 1;
while (actualLength > 0)
actualLength = IOUtils.readFully(inputStream, buffer, pos, step);
pos += actualLength;
String str = new String(buffer, 0, actualLength, StandardCharsets.UTF_8);
// something what you want to do
但可能很难处理反向压力(消费者可能比生产者更快,反之亦然)。所以我尝试将 Akka Streams 与 BZip2CompressorInputStream
一起使用。
【讨论】:
以上是关于Java - 读取 BZ2 文件并即时解压缩/解析的主要内容,如果未能解决你的问题,请参考以下文章
下载一个zip,解压缩并解析它 - 全部在内存中 - Java