Статьи

Чтение / запись сжатых и несжатых файлов в Java

Основная причина этого поста — попытка не повторяться ( СУХОЙ ), потому что часто я сталкиваюсь с рекурсивной необходимостью чтения и записи сжатых и несжатых файлов (в основном JSON и CSV).

Давайте сначала посмотрим, как читать текстовые файлы. Обратите внимание, что я работаю с (относительно небольшими) текстовыми файлами так:

  1. Методы чтения возвращают строку со всем содержимым.
  2. Я использую BufferedReader для чтения построчно.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
private String readFile(String fileName) {
    StringBuilder sb = new StringBuilder();
    try {
        BufferedReader input = new BufferedReader(new FileReader(new File(fileName)));
        try {
            String line = null;
            while ((line = input.readLine()) != null) {
                sb.append(line);
            }
        } finally {
            input.close();
        }
    } catch (IOException ex) {
        // Handle exception
        return null;
    }
 
    return sb.toString();
}

Примечание: есть несколько способов сделать что-то. В записи Лучший способ чтения текстового файла , где вы можете найти много разных способов чтения текстового файла в зависимости от версии JDK и размера файла.

Точно так же, чтобы записать строку в файл:

01
02
03
04
05
06
07
08
09
10
private void writeFile(String fileName, String value) {
    try {
        FileWriter fw = new FileWriter(fileName);
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(value);
        bw.close();
    } catch (IOException ex) {
        // Handle exception
    }
}

Для чтения / записи сжатых файлов, то есть двоичных данных, нам нужно работать с потоками и буферами. Итак, чтобы прочитать сжатый файл GZIP и получить строку:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
private String readCompressedFile(String fileName) {
    try {
        GZIPInputStream gis = new GZIPInputStream(new FileInputStream(fileName));
        ByteArrayOutputStream fos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = gis.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        fos.close();
        gis.close();
        return new String(fos.toByteArray());
    } catch (IOException ex) {
        // Handle exception
        return null;
    }
}

и аналогичным образом записать строку в сжатый файл GZip:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
private void writeCompressedFile(String fileName, String value) {
    try {
        InputStream is = new ByteArrayInputStream(value.getBytes());
        GZIPOutputStream gzipOS = new GZIPOutputStream(new FileOutputStream(fileName));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            gzipOS.write(buffer, 0, len);
        }
        gzipOS.close();
        is.close();
    } catch (IOException ex) {
        // Handle exception
    }
}

Ресурсы

Далее вы можете найти пару отличных ссылок с кодом Java для различных версий JDK:

Ссылка: Чтение / запись сжатых и несжатых файлов на Java от нашего партнера JCG Антонио Сантьяго в блоге A Curious Animal .