【问题标题】:Reading a UTF-8 string from ZipFileInputStream从 ZipFileInputStream 读取 UTF-8 字符串
【发布时间】:2014-08-14 05:05:56
【问题描述】:

我正在尝试从 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: 我更改了代码,以便将原始 String 的字节数组与我从 zipfile 读回的字节数组进行比较,它们非常匹配!所以这可能是我在获得字节后构建字符串的方式。

Arrays.equals(converted, orgi)

【问题讨论】:

    标签: java utf-8 compression zipinputstream


    【解决方案1】:

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

    zo.write( s.getBytes() );
    

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

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

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

    请注意,您声明了 writer 流,但您实际上从未将它用于任何事情(在这种情况下,您也不应该使用它,因为写入它只会将未压缩的字符串数据写入同一流 bos 与您的 @ 987654328@ 写入)。看起来你可能会在这里一次尝试几种不同的东西感到困惑,你应该摆脱writer

    【讨论】:

      【解决方案2】:

      一方面,BufferedReader#ready() 不是读取输入的好指标。原因有很多

      第二,你正在使用

      b.append( r.readLine() ).append(" ");
      

      它总是在每次迭代中添加一个" "。正因为如此,生成的String 值必然与原始值不同。

      第三,shout out to Jason C about your BufferedWriter not doing anything.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-18
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多