我正在用Files.lines(...)讀取一個非常大(500mb)的文件。 它讀取的文件的一部分,但在某些時候它打破了java.io.UncheckedIOException:java.nio.charset.MalformedInputException:輸入長度= 1Files.lines跳過Java8中的折線
我認爲該文件具有不同的字符集的行。有沒有辦法跳過這些虛線?我知道返回的流是由讀者支持的,讀者我知道如何跳過,但不知道如何從流中獲取讀取器以根據需要設置它。
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
}
感謝您的回答Holger。我也想知道是否可以用流來避免樣板代碼,但看起來是不可能的(該流由一個Reader支持,我希望能夠以某種方式獲取該閱讀器並添加解碼器) – Francesco 2014-09-27 07:40:05
這不支持該API。但即使是這樣,它也不會比這裏的代碼更緊湊。請注意,「樣板」只是一條附加線。結果看起來更加冗長,只是因爲我不喜歡水平滾動,所以我做了更慷慨的格式化。那麼,當我發佈更廣泛的觀衆的代碼示例時,我比我在真實的代碼中使用更多的空白空間。當然,您可以爲'StandardCharsets.UTF_8'以及'CodingErrorAction。*','Channels.newReader','FileChannel.open'等內聯'dec'和'path'並使用'import static'。 – Holger 2014-09-27 08:20:59
是的我同意。再次感謝Holger。 – Francesco 2014-09-27 09:00:32