提问人:Keith Fosberg 提问时间:3/6/2021 最后编辑:Keith Fosberg 更新时间:3/11/2021 访问量:79
避免“ZLIB 输入流意外结束”的时序要求
Timing requirements to avoid "Unexpected end of ZLIB input stream"
问:
我有一个日志分析工具,需要从 Linux 服务器获取 *.gz 文件并在 Linux 和 Windows 客户端上解压缩它们。在许多情况下,我收到“ZLIB 输入流的意外结束”,我认为这是 Linux 和 Windows 上文件的细节差异。
下面是我的功能。这是非常基本的。如何改进它以防止 EOF 错误?
“in”符号是在构造此函数所属的类时创建的 FileInputStream。
public void unzip(File fileTo) throws IOException {
OutputStream out = new FileOutputStream(fileTo);
LOGGER.info("Setting up the file for outputstream : "+fileTo);
try {
in = new GZIPInputStream(in);
byte[] buffer = new byte[65536];
int noRead;
while ((noRead = in.read(buffer)) != -1) {
out.write(buffer, 0, noRead);
}
} finally {
try { out.close(); } catch (Exception e) {}
}
}
我从上面改成了这个,现在它起作用了。似乎它在完成加载输入流之前尝试加载输出流。
public void unzip(File fileTo, String f) throws IOException,
EOFException, InterruptedException {
LOGGER.info("Setting up the file for outputstream : "+fileTo);
GZIPInputStream cIn = new GZIPInputStream(new FileInputStream(f));
OutputStream out = new FileOutputStream(fileTo);
fileTo.setReadable(true, false);
fileTo.setWritable(true, false);
byte[] buffer = new byte[65536];
int noRead;
for (int i = 10; i > 0 && cIn.available() == 1; i--) {
Thread.sleep(1000);
}
try {
while ((noRead = cIn.read(buffer)) != -1) {
out.write(buffer, 0, noRead);
}
} finally {
try { out.close();cIn.close();in.close(); } catch (Exception e) {}
}
}
答: 暂无答案
评论