我有一些损坏的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 "";
}
}
答案 0 :(得分:2)
如果这是用于将InputStream
转换为String
的方法,那么您的数据几乎肯定会丢失。
问题是UTF-8有很多字节序列是完全不合法的(即它们不代表任何值)。这些序列将替换为Unicode替换字符。
无论哪个无效字节序列被解码,该字符都是相同的。因此,这些字节中的特定信息将丢失。
答案 1 :(得分:2)
如果这是您拥有的代码,您永远不应该转换为Reader(或实际上是String)。仅保留为Stream(或字节数组)将避免破坏二进制文件。一旦它被读入字符串......非法序列(在utf-8中有很多)将被丢弃。
所以不,除非你很幸运,否则无法恢复信息。您必须提供另一个进程来处理纯流并插入纯BLOB而不是CLOB