You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解压S3存储桶中.bz文件的输入流并转为可读文本?

问题:解压S3存储桶中的.bz文件获取可读文本

我在S3存储桶中存储了.bz格式的文件,已经通过以下代码成功读取到文件流:

S3Object object = s3.getObject(bucket, path);
S3ObjectInputStream inputStream = object.getObjectContent();

但尝试直接读取流内容时,得到的仍是机器可读的乱码而非可读英文文本:

String text = new BufferedReader(
  new InputStreamReader(inputStream, StandardCharsets.UTF_8))
    .lines()
    .collect(Collectors.joining("\n"));

请问该如何获取解压后的可读文本?


解决方案

你直接读取的是未解压的BZip2压缩流,自然会得到乱码。需要先通过BZip2解压工具处理输入流,再读取文本内容。Java标准库没有内置BZip2解压支持,通常使用Apache Commons Compress库来实现。

1. 引入依赖(Maven)

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.26.1</version> <!-- 使用最新稳定版本 -->
</dependency>

2. 解压并读取文本的代码示例

使用BZip2CompressorInputStream包裹原始输入流,再通过字符流读取:

import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;

// ... 你的S3读取代码 ...
S3Object object = s3.getObject(bucket, path);
try (S3ObjectInputStream inputStream = object.getObjectContent();
     BZip2CompressorInputStream bzInputStream = new BZip2CompressorInputStream(inputStream);
     BufferedReader reader = new BufferedReader(new InputStreamReader(bzInputStream, StandardCharsets.UTF_8))) {

    String readableText = reader.lines().collect(Collectors.joining("\n"));
    // 处理解压后的可读文本
    System.out.println(readableText);
} catch (Exception e) {
    e.printStackTrace();
}

关键说明

  • 使用try-with-resources自动关闭所有流,避免资源泄漏
  • BZip2CompressorInputStream会自动处理BZip2格式的压缩数据,将其转换为原始字节流
  • 最后通过InputStreamReader和BufferedReader读取为UTF-8编码的文本

内容的提问来源于stack exchange,提问作者Java dev VK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:36:17