Sto leggendo un file molto grande (500mb) con Files.lines (...). Si legge una parte del file, ma ad un certo punto si rompe con java.io.UncheckedIOException: java.nio.charset.MalformedInputException: lunghezza ingresso = 1Files.lines per saltare linee spezzate in Java8
penso che il file ha linee con diversi set di caratteri. C'è un modo per saltare queste linee spezzate? So che lo stream restituito è supportato da un Reader e con il lettore so come saltare, ma non so come ottenere il Reader dallo stream per configurarlo come preferisco.
List<String> lines = new ArrayList<>();
try (Stream<String> stream = Files.lines(Paths.get(getClass().getClassLoader().getResource("bigtest.txt").toURI()), Charset.forName("UTF-8"))) {
stream
.filter(s -> s.substring(0, 2).equalsIgnoreCase("aa"))
.forEach(lines::add);
} catch (final IOException e) {
// catch
}
grazie per la risposta Holger. Mi chiedevo anche se è possibile farlo con lo stream per evitare il codice boilerplate, ma non sembra possibile (il flusso è supportato da un Reader, speravo che fosse possibile ottenere il lettore in qualche modo e aggiungere il decoder) – Francesco
Questo non è supportato da quell'API. Ma anche se lo fosse, non sarebbe più compatto del codice qui. Si noti che il "boilerplate" è solo una riga aggiuntiva. Il risultato sembra più prolisso solo perché ho fatto una formattazione più generosa in quanto non mi piace lo scorrimento orizzontale. Bene, e uso più spazio bianco quando pubblichiamo esempi di codice per il pubblico più ampio di quanto non faccia nel mio vero codice. Ovviamente, è possibile inserire 'dec' e' path' e usare 'import static' per' StandardCharsets.UTF_8', nonché per 'CodingErrorAction. *', 'Channels.newReader',' FileChannel.open', ecc. – Holger
Si, sono d'accordo. Grazie ancora Holger. – Francesco