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é.
Prenons un fichier csv compressé au format gzip comme exemple
Le point est
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()));
}
Le point est presque le même que la lecture
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));
}
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.
Recommended Posts