这取决于您希望如何处理数据,哪种交付方式是适当的。因此,如果您的处理要求逐行处理数据,则无法这样做。
如果你真的想要的字符数据的固定大小的块,你可以使用下面的方法(S):
public static Stream<String> chunks(Path path, int chunkSize) throws IOException {
return chunks(path, chunkSize, StandardCharsets.UTF_8);
}
public static Stream<String> chunks(Path path, int chunkSize, Charset cs)
throws IOException {
Objects.requireNonNull(path);
Objects.requireNonNull(cs);
if(chunkSize<=0) throw new IllegalArgumentException();
CharBuffer cb = CharBuffer.allocate(chunkSize);
BufferedReader r = Files.newBufferedReader(path, cs);
return StreamSupport.stream(
new Spliterators.AbstractSpliterator<String>(
Files.size(path)/chunkSize, Spliterator.ORDERED|Spliterator.NONNULL) {
@Override public boolean tryAdvance(Consumer<? super String> action) {
try { do {} while(cb.hasRemaining() && r.read(cb)>0); }
catch (IOException ex) { throw new UncheckedIOException(ex); }
if(cb.position()==0) return false;
action.accept(cb.flip().toString());
return true;
}
}, false).onClose(() -> {
try { r.close(); } catch(IOException ex) { throw new UncheckedIOException(ex); }
});
}
,但如果你的下一个问题是“我怎么能合并相邻的我也不会感到惊讶流元素“,因为这些固定大小的块很少是实际任务的自然数据单元。
通常情况下,接下来的步骤是在内容中执行模式匹配,在这种情况下,首先使用Scanner
比较好,它可以在流式传输数据时执行模式匹配,可以完成因为正则表达式引擎会告诉您缓冲更多数据是否会改变匹配操作的结果(请参阅hitEnd()
和requireEnd()
)。不幸的是,仅从Scanner
生成的匹配流才被添加到Java 9中,但请参阅this answer,以获得该功能的后端端口到Java 8的功能。
'Files.lines(path)'和'bufferedReader.lines() '是为了读取字符/字符串,而'InputStream :: read'方法用于读取字节。我不知道你的问题在哪里。 – Flown
如果输入是基于行的,并且一个Stream链可以单独处理每一行,那么相同的数据如何在固定大小的块中处理? – Andreas