意外的Java GZIPOutputStream结果

时间:2019-03-12 14:07:07

标签: java gzip gzipoutputstream

我们具有以下Java方法来使用GZIPOutputStream压缩文件

 private void archive(Path originalFile) {
    Path tempFile = originalFile.resolveSibling(originalFile.toFile().getName() + TEMPORARY_FILE_EXTENSION);
    Path gzippedFile = originalFile.resolveSibling(originalFile.toFile().getName() + ARCHIVED_FILE_EXTENSION);
    try {
        try (FileInputStream input = new FileInputStream(originalFile.toFile());
            BufferedOutputStream output = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(tempFile.toFile())))) {
            IOUtils.copy(input,output);
            output.flush();
        }
        Files.move(tempFile, gzippedFile, StandardCopyOption.REPLACE_EXISTING);
        Files.delete(originalFile);
        LOGGER.info("Archived file {} to {}", originalFile, gzippedFile);
    } catch (IOException e) {
        LOGGER.error("Could not archive file {}: " + e.getMessage(), originalFile, e);
    }
    try {
        Files.deleteIfExists(tempFile);
    } catch (IOException e) {
        LOGGER.error("Could not delete temporary file {}: " + e.getMessage(), tempFile, e);
    }
}

问题在于,如果我们手动解压缩该文件:

gzip -d file_name

生成的解压缩文件与原始文件不匹配。 文件大小和总行数减少。例如,从33MB增加到32MB,丢失80万行。

问题可能与我们正在压缩的文件的编码( EBCDIC )有关吗? https://en.wikipedia.org/wiki/EBCDIC

1 个答案:

答案 0 :(得分:0)

经过几次测试后,我们无法重现该问题,它一定与压缩期间卷上的没有足够的空间有关。 @SirFartALot感谢您指出这一点。