由于字符编码而导致Gzip字符串损坏

时间:2011-05-05 14:55:52

标签: java utf-8 character-encoding gzip

我有一些损坏的Gzip日志文件,我正在尝试恢复。这些文件通过Java支持的网页传输到我们的服务器。这些文件始终以纯文本形式发送,但我们最近开始接收Gzip压缩的日志文件。这些Gzip压缩文件似乎已损坏,并且无法解压缩,并且原件已被删除。我相信这是来自下面方法中的字符编码。

有没有办法恢复将文件恢复为原始压缩格式的过程?我在数据库blob中得到了Strings二进制数组数据。

感谢您提供任何帮助!

 private String convertStreamToString(InputStream is) throws IOException {
    /*
     * To convert the InputStream to String we use the
     * Reader.read(char[] buffer) method. We iterate until the
     * Reader return -1 which means there's no more data to
     * read. We use the StringWriter class to produce the string.
     */
    if (is != null) {
        Writer writer = new StringWriter();

        char[] buffer = new char[1024];
        try {
            Reader reader = new BufferedReader(
                    new InputStreamReader(is, "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        return writer.toString();
    } else {
        return "";
    }
}

2 个答案:

答案 0 :(得分:2)

如果这是用于将InputStream转换为String的方法,那么您的数据几乎肯定会丢失。

问题是UTF-8有很多字节序列是完全不合法的(即它们不代表任何值)。这些序列将替换为Unicode替换字符。

无论哪个无效字节序列被解码,该字符都是相同的。因此,这些字节中的特定信息将丢失。

答案 1 :(得分:2)

如果这是您拥有的代码,您永远不应该转换为Reader(或实际上是String)。仅保留为Stream(或字节数组)将避免破坏二进制文件。一旦它被读入字符串......非法序列(在utf-8中有很多)将被丢弃。

所以不,除非你很幸运,否则无法恢复信息。您必须提供另一个进程来处理纯流并插入纯BLOB而不是CLOB