Сбой распаковки изображения с использованием буфера из формата gzip - PullRequest
2 голосов
/ 09 мая 2019

Я архивирую файлы с помощью, но, разархивируя их, я сталкиваюсь с двумя проблемами,

  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 Ответ

2 голосов
/ 09 мая 2019

Вы пишете не 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...