Es gibt Fälle, in denen große Dateien unverändert ausgetauscht und gzip komprimiert werden. Organisiertes Lesen und Schreiben von Dateien mit gzip in Java. Es ist von Java8, aber es scheint, dass Java11 auch verwendet werden kann.
Nehmen Sie als Beispiel eine gzip-komprimierte CSV-Datei
Der Punkt ist
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);
}
Das Umschließen mit BufferedReader dient der Leistung. In der Praxis ist es üblich, eine CSV-Ladebibliothek zu verwenden. Hier ist ein Beispiel mit univocity_parsers.
Dies ist ein Beispiel für die Behandlung mit einem Iterator, der eine große Kapazität voraussetzt.
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()));
}
Der Punkt ist fast der gleiche wie beim Lesen
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));
}
Hier ist ein Beispiel für das Schreiben mit der CSV-Bibliothek.
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));
}
Ich weiß nicht, wie ich es machen soll, aber es fühlt sich so an, als ob ich das Objekt einwickeln sollte. Wenn Sie einen Leser oder Schreiber an die CSV-Bibliothek übergeben, wird dies häufig für Sie erledigt. In dieser Hinsicht lohnt es sich, viele Male einzuwickeln.
Recommended Posts