Lire et écrire des fichiers gzip en Java

introduction

Il y a des cas où des fichiers volumineux sont échangés tels quels, avec gzip compressé. Lecture et écriture organisées de fichiers avec gzip en java. Cela vient de Java8, mais il semble que java11 puisse également être utilisé.

Lis

Prenons un fichier csv compressé au format gzip comme exemple

Le point est

  1. Utilisez la syntaxe try-with-resources
  2. Enveloppez InputSream avec GZIPInputStream
  3. Enveloppez GZIPInputStream avec InputStreamReader
  4. Vous pouvez spécifier l'encodage lors de l'utilisation d'InputStreamReader
  5. Enveloppez le InputStreamReader avec un BufferedReader

Java



Path path = Paths.get("read_test.csv.gz");
try(
  InputStream is = Files.newInputStream(path);
  GZIPInputStream gis = new GZIPInputStream(is);
  InputStreamReader isReader = new InputStreamReader(gis, StandardCharsets.UTF_8);
  BufferedReader br = new BufferedReader(isReader); 
) {
  br.lines().forEach(System.out::println);
}

L'emballage avec BufferedReader est pour la performance. En pratique, il est habituel d'utiliser une bibliothèque de chargement csv. Voici un exemple utilisant univocity_parsers.

Ceci est un exemple de manipulation avec un itérateur en supposant une grande capacité.

Path path = Paths.get("read_test.csv.gz");
try(
  InputStream is = Files.newInputStream(path);
  GZIPInputStream gis = new GZIPInputStream(is);
  InputStreamReader isReader = new InputStreamReader(gis, StandardCharsets.UTF_8);
  BufferedReader br = new BufferedReader(isReader); 
) {
  CsvParserSettings parserSettings = new CsvParserSettings();
  CsvRoutines routines = new CsvRoutines(parserSettings);
  Iterator<TestDTO> iterator = routines.iterate(TestDTO.class, br).iterator();
  iterator.forEachRemaining(x -> System.out.println(x.toString()));
}

l'écriture

Le point est presque le même que la lecture

  1. Utilisez la syntaxe try-with-resources
  2. Enveloppez le flux de sortie avec un flux de sortie GZIP
  3. Enveloppez GZIPOutputStream avec OutputStreamWriter
  4. OutputStreamWriter peut spécifier le codage
  5. Enveloppez OutputStreamWriter avec BufferedWriter
Path path = Paths.get("write_test.csv.gz");
try (
  OutputStream os = Files.newOutputStream(path,StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);
  GZIPOutputStream gzip = new GZIPOutputStream(os);
  OutputStreamWriter ow = new OutputStreamWriter(gzip, StandardCharsets.UTF_8);
  BufferedWriter bw = new BufferedWriter(ow);) {
  List<String> rows = ...;
  rows.stream().forEach(row -> bw.write(row)); 
}  

Voici un exemple d'écriture à l'aide de la bibliothèque csv.

Path path = Paths.get("write_test.csv.gz");
try (
  OutputStream os = Files.newOutputStream(path,StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);
  GZIPOutputStream gzip = new GZIPOutputStream(os);
  OutputStreamWriter ow = new OutputStreamWriter(gzip, StandardCharsets.UTF_8);
  BufferedWriter bw = new BufferedWriter(ow);) {
  List<TestDTO> rows = ...;
  CsvWriterSettings writerSettings = new CsvWriterSettings();
  CsvWriter writer = new CsvWriter(bw , writerSettings);
  rows.stream().forEach(rows -> writer.processRecord(row));
}  

Impressions

Je ne sais pas comment faire, mais j'ai l'impression de combien de fois je devrais envelopper l'objet. Fondamentalement, si vous passez un lecteur ou un écrivain à la bibliothèque csv, il le fera souvent pour vous. À cet égard, cela vaut la peine d'être emballé plusieurs fois.

Lien de référence

Recommended Posts

Lire et écrire des fichiers gzip en Java
[Java] Lecture et écriture de fichiers avec OpenCSV
Implémenter l'écriture et la lecture dans la liste des propriétés (.plist) dans Swift
Lire et écrire des fichiers gzip en Java
[Review] Lecture et écriture de fichiers avec java (JDK6)
Différences dans l'écriture des classes Java, C # et Javascript
Lire des fichiers binaires en Java 1
Lire des fichiers binaires dans Java 2
J'ai essayé de mâcher C # (lire et écrire des fichiers)
Implémenter l'écriture et la lecture dans la liste des propriétés (.plist) dans Swift
Lisez facilement les fichiers texte en Java (Java 11 et Java 7)
Exemple d'encodage et de décodage en Java
Classe StringBuffer et StringBuilder en Java
Comprendre equals et hashCode en Java
Bonjour tout le monde en Java et Gradle
Différence entre final et immuable en Java
Différences d'écriture en Ruby, PHP, Java, JS
Convertir des fichiers SVG en fichiers PNG en Java
Lecture de fichiers RAW, WAV, MP3 en Java
Discussion continue sur l'écriture de Java avec Emacs @ 2018
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
L'histoire de l'écriture de Java dans Emacs
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur
Spécifiez l'ordre dans lequel les fichiers de configuration et les classes sont chargés dans Java
Notes pour lire et générer des fichiers xlsx à partir de Java à l'aide d'Apache POI
Détecter des vidéos similaires dans Java et OpenCV rev.2
[Java] Que dois-je utiliser pour écrire des fichiers?
Techniques de lecture du code source Java dans Eclipse
Partition en Java
Traitement parallèle et parallèle dans divers langages (édition Java)
Différence entre next () et nextLine () dans Java Scanner
Changements dans Java 11
Placez les fichiers CSV contenant "'" et "" "dans Ruby 2.3 dans MySQL
Janken à Java
Capture et sauvegarde de l'installation de sélénium en Java
Détecter des vidéos similaires dans Java et OpenCV rev.3
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
Résumer les différences entre l'écriture C # et Java
XXE et Java
Introduction à Apache Beam (1) ~ Lecture et écriture de texte ~
Java ajoute et supprime les filigranes dans les documents Word
Détecter des vidéos similaires dans Java et OpenCV rev.1
Taux circonférentiel à Java
Représente le «jour suivant» et le «jour précédent» en Java / Android
Importer des fichiers de la même hiérarchie en Java
Télécharger et télécharger des notes en java sur S3
Crypter / décrypter avec AES256 en PHP et Java
Générer OffsetDateTime à partir de Clock et LocalDateTime en Java
FizzBuzz en Java
Organisez la différence de confort d'écriture entre l'expression lambda Java et l'expression lambda Kotlin.
[Android / Java] Transition d'écran et traitement de retour par fragments
Convertir JSON et YAML en Java (en utilisant Jackson et SnakeYAML)
Essayé l'API Toot et Streaming de Mastodon en Java