意外的 Java GZIPOutputStream 结果
Unexpected Java GZIPOutputStream results
我们有以下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,损失了 800K 行。
问题可能与我们正在压缩的文件的编码 (EBCDIC) 有关吗?
https://en.wikipedia.org/wiki/EBCDIC
经过几次测试后,我们无法重现该问题,这一定与压缩期间 没有足够的 space 有关。 @SirFartALot 感谢您指出这一点。
我们有以下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,损失了 800K 行。
问题可能与我们正在压缩的文件的编码 (EBCDIC) 有关吗? https://en.wikipedia.org/wiki/EBCDIC
经过几次测试后,我们无法重现该问题,这一定与压缩期间 没有足够的 space 有关。 @SirFartALot 感谢您指出这一点。