Java 如何将多行记录从文本文件转换为流<;列表<;字符串>>;?

Java 如何将多行记录从文本文件转换为流<;列表<;字符串>>;?,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个包含以下记录的文本文件: -------------------- Field1=Value1 Field2=Value2 Field3=Value3 EOR --------------------- Field1=Value1 Field2=Value2 Field3=Value3 Field4=Value4 Field5=Value5 EOR 每条记录可以有多行。每个记录的末尾都标有“EOR”一词 我想将这些行从文本文件处理成一个记录流,例如,stream。到目前为止,我只能通过

我有一个包含以下记录的文本文件:

--------------------
Field1=Value1
Field2=Value2
Field3=Value3
EOR
---------------------
Field1=Value1
Field2=Value2
Field3=Value3
Field4=Value4
Field5=Value5
EOR
每条记录可以有多行。每个记录的末尾都标有“EOR”一词

我想将这些行从文本文件处理成一个记录流,例如,
stream
。到目前为止,我只能通过Files.lines(pathToFile))获得一个
表单,其中每个元素都是一行

我正在寻找一种方法,用library将这个字符串流转换成
列表流


假设您不想引入任何依赖项,那么编写一个迭代器然后对其进行流式处理是非常简单的

public class SampleJava {
public static void main(String args[]) throws IOException {
    try(Stream<String> lines = Files.lines(Paths.get("records.txt"))) {
        new RecordIterator(lines).stream().forEach(System.out::println);
    }
}
static class RecordIterator implements Iterator<List<String>>
{
    private final static String SEP = "---";
    private final static String EOR = "EOR";
    private final Iterator<String> lines;
    public RecordIterator(Stream<String> lines) {
        this.lines = lines.iterator();
    }
    @Override
    public boolean hasNext() {
        return lines.hasNext();
    }
    @Override
    public List<String> next() {
        if(!hasNext()) throw new NoSuchElementException();
        List<String> record = new ArrayList<>();
        do {
            String next = lines.next();
            if(next.startsWith(SEP)) continue;
            if(next.equals(EOR)) break;
            record.add(next);
        } while(hasNext());
        return record;
    }
    public Stream<List<String>> stream() {
        Iterable<List<String>> itor = ()-> this;
        return StreamSupport.stream(itor.spliterator(), false);
    }
}
}
public类SampleJava{
公共静态void main(字符串args[])引发IOException{
try(streamlines=Files.lines(path.get(“records.txt”)){
新的RecordIterator(lines).stream().forEach(System.out::println);
}
}
静态类RecordIterator实现迭代器
{
私有最终静态字符串SEP=“--”;
专用最终静态字符串EOR=“EOR”;
私有最终迭代器行;
公共记录迭代器(流行){
this.lines=lines.iterator();
}
@凌驾
公共布尔hasNext(){
返回行。hasNext();
}
@凌驾
公开名单下一页(){
如果(!hasNext())抛出新的NoSuchElementException();
列表记录=新的ArrayList();
做{
String next=lines.next();
如果(next.startsWith(SEP))继续;
如果(下一个等于(EOR))破裂;
记录。添加(下一步);
}while(hasNext());
返回记录;
}
公共流(){
Iterable itor=()->this;
返回StreamSupport.stream(itor.spliterator(),false);
}
}
}
输出:

[Field1=Value1,Field2=Value2,Field3=Value3]

[Field1=Value1,Field2=Value2,Field3=Value3,Field4=Value4,Field5=Value5]


我们能看看,到目前为止你得到了什么代码吗?
public class SampleJava {
public static void main(String args[]) throws IOException {
    try(Stream<String> lines = Files.lines(Paths.get("records.txt"))) {
        new RecordIterator(lines).stream().forEach(System.out::println);
    }
}
static class RecordIterator implements Iterator<List<String>>
{
    private final static String SEP = "---";
    private final static String EOR = "EOR";
    private final Iterator<String> lines;
    public RecordIterator(Stream<String> lines) {
        this.lines = lines.iterator();
    }
    @Override
    public boolean hasNext() {
        return lines.hasNext();
    }
    @Override
    public List<String> next() {
        if(!hasNext()) throw new NoSuchElementException();
        List<String> record = new ArrayList<>();
        do {
            String next = lines.next();
            if(next.startsWith(SEP)) continue;
            if(next.equals(EOR)) break;
            record.add(next);
        } while(hasNext());
        return record;
    }
    public Stream<List<String>> stream() {
        Iterable<List<String>> itor = ()-> this;
        return StreamSupport.stream(itor.spliterator(), false);
    }
}
}