使用gzip格式的缓冲区解压缩失败的图像

时间:2019-05-09 06:21:12

标签: java gzip

我正在使用压缩文件,但是在解压缩文件时,我遇到了两个问题,

  1. 在没有缓冲的情况下将其恢复为原始格式,但是当我使用缓冲时,其无法正确执行

  2. 已解压缩文件的大小大于原始文件

private static void writeFile(FileOutputStream fos, String zipFilePath) throws IOException {
        try (FileInputStream fis = new FileInputStream(zipFilePath);
                GZIPInputStream inflaterInputStream = new GZIPInputStream(fis)) {
            int data;
            **while ((data = inflaterInputStream.read()) != -1) {//without buffer**
                fos.write(data);
            }
        }
    }

private static void writeFile(FileOutputStream fos, String zipFilePath) throws IOException {
        byte[] buffer = new byte[12048];
        try (FileInputStream fis = new FileInputStream(zipFilePath);
                GZIPInputStream inflaterInputStream = new GZIPInputStream(fis)) {
            int data;
            **while ((data = inflaterInputStream.read(buffer)) != -1) {//with buffer**
                fos.write(data);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

您不是在写buffer,而是在写data,即读取的字节长度...

已更正:

private static void writeFile(FileOutputStream fos, String zipFilePath) throws IOException {
    byte[] buffer = new byte[12048];
    try (InputStream fis = new FileInputStream(zipFilePath);
         InputStream inflaterInputStream = new GZIPInputStream(fis)) {
         int data;
         while ((data = inflaterInputStream.read(buffer)) != -1) {//with buffer**
             fos.write(buffer, 0, data);
         }
    }
}

使用apache.commons-io

会更好
private static void writeFile(FileOutputStream fos, String zipFilePath) throws IOException {
    try (InputStream fis = new FileInputStream(zipFilePath);
         InputStream inflaterInputStream = new GZIPInputStream(fis)) {
        IOUtils.copy(fis, fos);
    }
}