2

我一定做错了什么。在 Android 上运行以下代码会生成截断的文件 (_items_),而日志中没有任何异常或问题。使用 OpenJDK 7 运行相同的代码可以正确解压缩文件。

try {
    final InputStream fis = new GZIPInputStream(new FileInputStream("/storage/sdcard/_items"));
    try {
        final FileOutputStream fos = new FileOutputStream("/storage/sdcard/_items_");
        try {
            final byte[] buffer = new byte[1024];
            int n;
            while ((n = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, n);
            }
        } finally {
            fos.close();
        }
    } finally {
        fis.close();
    }
} catch (final IOException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
}

我已经在 Android 模拟器 (API 18) 和 Desire HD (Android 2.3.5) 上进行了尝试,结果相同。

输入文件(_items):https ://drive.google.com/file/d/0B6M72P2gzYmwaHg4SzRTYnRMOVk/edit?usp=sharing

Android 截断输出文件 (_items_):https ://drive.google.com/file/d/0B6M72P2gzYmwMUZIZ2FEaHNZUFk/edit?usp=sharing

4

2 回答 2

1

Dalvik 团队的工程师通过分析更新了AOSP 错误。

总结:gzip 流有多个连接在一起的成员,解压缩器预计会处理它们,但 Dalvik 的实现在第一个之后停止。

除非有办法说服数据源以不同方式压缩其流,否则您将需要找到GZIPInputStream.

于 2013-12-19T15:45:40.690 回答
1

解决方法是GZIPInputStream从 JZlib 中使用(目前仅在concatenated_gzip_streams分支中)。有关更多详细信息,请参阅https://github.com/ymnk/jzlib/issues/12

于 2013-12-20T14:51:04.287 回答