java - 从 ZipFileInputStream 读取 UTF-8 字符串

标签 java utf-8 compression zipinputstream

我正在尝试从 zipFile 中读取 UTF-8 文件,结果证明这是一个重大挑战。

在这里,我将字符串压缩到一个字节数组以保存到我的数据库中。

            ByteArrayOutputStream bos = new ByteArrayOutputStream();

            ZipOutputStream zo = new ZipOutputStream( bos );
            zo.setLevel(9);

            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(bos, Charset.forName("utf-8"))
                );          
            ZipEntry ze = new ZipEntry("data");         
            zo.putNextEntry(ze);
            zo.write( s.getBytes() );

            zo.close();
            writer.close();

            return bos.toByteArray();

这就是我读回字符串的方式:

ZipInputStream zis = new ZipInputStream( new ByteArrayInputStream(bytes) );
ZipEntry entry = zis.getNextEntry();
byte[] buffer = new byte[2048];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int size;

while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
    bos.write(buffer, 0, size);
}

BufferedReader  r = new BufferedReader( new InputStreamReader( new ByteArrayInputStream( bos.toByteArray() ), Charset.forName("utf-8") ) );
StringBuilder b = new StringBuilder();
while (r.ready()) {
    b.append( r.readLine() ).append(" ");
}

我在这里得到的字符串丢失了 UTF8 字符!

更新 1: 我更改了代码,以便将原始字符串的字节数组与我从 zipfile 中读回的字节数组进行比较,它们非常匹配!所以这可能是我在获得字节后构建字符串的方式。

Arrays.equals(converted, orgi)

最佳答案

你的问题出在写作上,假设sString ,你有:

zo.write( s.getBytes() );

但这会转换 s使用默认编码的字节。您需要使用 UTF-8 进行该转换:

zo.write( s.getBytes("utf-8") );

您观察到原始字节与未压缩字节相同是有道理的,因为原始写入数据是问题的根源。

请注意,您有 writer stream 声明,但您实际上从未将它用于任何事情(在这种情况下,您也不应该,因为写入它只会将未压缩的字符串数据写入您的 bos 写入的同一流 ZipOutputStream。看起来你可能对在这里同时尝试一些不同的事情感到困惑,你应该摆脱 writer .

关于java - 从 ZipFileInputStream 读取 UTF-8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300454/

相关文章:

javascript - 如何将字符串转换为 URI 组件?

pdf - 为什么 pdf2ps/ps2pdf 组合会缩小 PDF?

image - JPEG 的基线架构是什么?

java - 由runnable线程执行的runnable外部runnable实例的调用方法

java - 百分比符号 (%) 是什么意思?

java - 如何在 Java 中使用#anchor 启动 URL?

javascript - 生成一个随机数字序列,然后在 JavaScript 中向该序列附加一个大写字母?

java - 如何在 map 键上应用 jackson-databind 反序列化器?

python - 在 Python 中从套接字读取时解码内容

PHP - 在保持文件扩展名的同时压缩 txt 文件