如何解压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
相关产品推荐
相关产品推荐

