Java: сохранить строку как файл gzip

Я новичок в Java, мне нужно что-то вроде это:

String2GzipFile (String file_content, String file_name)
String2GzipFile("Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "lorem.txt.gz")

Я не могу понять, как это сделать.


person Luistar15    schedule 13.05.2011    source источник


Ответы (3)


Здесь есть два ортогональных понятия:

  • Преобразование текста в двоичный формат, обычно через OutputStreamWriter
  • Сжатие двоичных данных, например. используя GZIPOutputStream

Итак, в конце вы захотите:

  • Создайте OutputStream, который записывает результат туда, куда вы хотите (например, в файл или в память через ByteArrayOutputStream).
  • Заверните это OutputStream в GZIPOutputStream
  • Оберните GZIPOutputStream в OutputStreamWriter, используя соответствующую кодировку (например, UTF-8)
  • Напишите текст на OutputStreamWriter
  • Закройте модуль записи, который очистит и закроет все остальное.

Например:

FileOutputStream output = new FileOutputStream(fileName);
try {
  Writer writer = new OutputStreamWriter(new GZIPOutputStream(output), "UTF-8");
  try {
    writer.write(text);
  } finally {
    writer.close();
  }
 } finally {
   output.close();
 }

Обратите внимание, что я закрываю output, даже если нам не удастся создать средство записи, но нам все равно нужно закрыть writer, если все прошло успешно, чтобы сбросить все и закончить запись данных.

person Jon Skeet    schedule 13.05.2011
comment
Я пытался использовать ByteArrayOutputStream, но ваш пример работает отлично. Спасибо - person Luistar15; 13.05.2011
comment
@user752679: user752679: Первоначально я записал образец с помощью ByteArrayOutputStream, но, как говорится в вашем вопросе, вы хотите записать его в файл... - person Jon Skeet; 13.05.2011
comment
примечание: не забудьте закрыть streamWriter, иначе вы получите unexpected EOF при попытке открыть *.gzip - stackoverflow.com/a/12100352/432903 - person prayagupd; 30.03.2019

Взгляните на GZIPOutputStream. - вы должны иметь возможность использовать это точно так же, как любой другой поток вывода для записи в файл - он просто автоматически запишет его в сжатом формате gzip.

person DaveH    schedule 13.05.2011

То же решение, что и у Джона, просто использовал попытку с ресурсами

try (FileOutputStream output = new FileOutputStream("filename.gz");
     Writer writer = new OutputStreamWriter(new GZIPOutputStream(output), "UTF-8")) {
    
    writer.write("someText");
}
person Niraj Sonawane    schedule 03.10.2018
comment
также, вероятно, предпочтительнее использовать StandardCharsets.UTF_8 вместо "UTF-8" - person Walter Tross; 02.07.2020