Files.lines (...) ile çok büyük (500mb) bir dosya okuyorum. Bu dosyanın bir kısmını okur ancak bazı noktada java.io.UncheckedIOException ile kırar: java.nio.charset.MalformedInputException: Girdi uzunluğu 1Files.lines, Java8'de kırık satırları atlamak için
Ben dosya farklı chartsets'ten ile çizgileri olduğunu düşünüyorum =. Bu kırık çizgileri atlamanın bir yolu var mı? Geri dönen akışın bir Reader tarafından desteklendiğini ve okuyucunun nasıl atlanacağını bildiğimi biliyorum, ancak Reader'ı istediğim gibi ayarlamak için akıştan nasıl alacağımı bilmiyorum. Önceden dekoder zaten bir istisna ile çözme durduğunda
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
}
. Ayrıca boilerplate kodundan kaçınmak için akıntıyla birlikte yapmanın mümkün olup olmadığını merak ediyordum, ama görünmüyor (akım bir Okuyucu tarafından destekleniyor, okuyucuyu bir şekilde almayı ve kod çözücüyü eklemeyi umuyordum) – Francesco
Bu API tarafından desteklenmiyor. Ama olsa bile, buradaki koddan daha kompakt olmayacaktı. “Boilerplate” in sadece bir ek satır olduğunu unutmayın. Sonuç sadece daha fazla ayrıntıya neden olur çünkü yatay kaydırma yapmayı sevmediğimden daha cömert bir biçimlendirme yaptım. Peki, daha geniş kitlelere kod örnekleri gönderirken gerçek kodumdan daha fazla beyaz alan kullanıyorum. Elbette 'dec' ve' path' satırını inline edebilir ve 'StandardCharsets.UTF_8' ile' CodingErrorAction ''' '' Channels.newReader' '' FileChannel.open'' vb. Için 'import statik' kullanabilirsiniz. – Holger
Evet katılıyorum. Tekrar teşekkürler Holger. – Francesco