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);
}
}
}