Распакуйте Gzip файл и сохраните в переменной

Я много искал для преобразования из байта в строку, но мой запрос немного отличается, пожалуйста, читайте дальше.

В настоящее время у меня есть файл gzip, который я могу распаковать, используя код с http://www.mkyong.com/java/how-to-decompress-file-from-gzip-file/. Этот код помогает мне сохранить распакованный вывод в файле, но как мне сохранить его в переменной? Я использую этот код в настоящее время:

public String unGunzipFile(String compressedFile, String decompressedFile) {

        byte[] buffer = new byte[1024];

        try {

            FileInputStream fileIn = new FileInputStream(compressedFile);

            GZIPInputStream gZIPInputStream = new GZIPInputStream(fileIn);

            FileOutputStream fileOutputStream = new FileOutputStream(decompressedFile);
            StringBuffer str = new StringBuffer();
            int bytes_read;
            while ((bytes_read = gZIPInputStream.read(buffer)) > 0) {

                String s = new String(buffer);
                str.append(s);
                fileOutputStream.write(buffer, 0, bytes_read);
            }

            gZIPInputStream.close();
            fileOutputStream.close();

            System.out.println("The file was decompressed successfully!");
            System.out.println(str);
            String final_string = str.toString();
            return final_string;

        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
    } 

Так как я конвертирую байты в строку ближе к концу, когда bytes_read не 1024 в длину, я получаю некоторые странные данные в моем StringBuffer, но в файле нет таких данных, так как fileOutputStream.write(buffer, 0, bytes_read); ограничивается написанием обновленной части. Как это исправить?

Заранее спасибо.

2 ответа

Решение

Использовать String(byte[] bytes, int offset, int length) конструктор, который позволяет указать длину для преобразования. т.е.

String s = new String(buffer, 0, bytes_read)

Вместо использования String s = new String(buffer), я предлагаю использовать

public String(byte[] bytes, int offset, int length)

что может помочь вам.

Другие вопросы по тегам