Основная причина этого поста — попытка не повторяться ( СУХОЙ ), потому что часто я сталкиваюсь с рекурсивной необходимостью чтения и записи сжатых и несжатых файлов (в основном JSON и CSV).
Давайте сначала посмотрим, как читать текстовые файлы. Обратите внимание, что я работаю с (относительно небольшими) текстовыми файлами так:
- Методы чтения возвращают строку со всем содержимым.
- Я использую
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 . |