避免“ZLIB 输入流意外结束”的时序要求

Timing requirements to avoid "Unexpected end of ZLIB input stream"

提问人:Keith Fosberg 提问时间:3/6/2021 最后编辑:Keith Fosberg 更新时间:3/11/2021 访问量:79

问:

我有一个日志分析工具,需要从 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) {}
        }
    }
Java Linux Windows gzip EOF

评论

2赞 PMF 3/6/2021
如果文件无法打开,您可以使用默认工具(例如 Winzip 或 7zip)读取它吗?如果是这样,问题出在您的 Gzip 库中,如果不是,则文件已损坏,这里的代码也不是罪魁祸首。
0赞 Keith Fosberg 3/6/2021
我认为你是对的——我认为问题出在别处。看起来当它应该是二进制时发生了 ascii xfer。
0赞 Keith Fosberg 3/6/2021
结果。。。不。此代码一直拖着前进,直到它因 EOF 错误而纾困。桌面工具可以正确打开存档。
0赞 Keith Fosberg 3/11/2021
解决了...不过,Rep 太低了,无法自己回答。哈哈

答: 暂无答案