我正在尝试使用Java流读取具有多行记录的文本文件
我有一个由记录组成的文本文件,每条记录位于 1 行或多行,由空行分隔。我正在尝试使用 Java 流生成记录,但遇到问题
import java.util.*;
import java.io.*;
import java.nio.file.*;
import java.util.stream.*;
public class Jstream {
public static void main(String[] args) {
new Jstream().run(args);
}
private void run(String[] args) {
String input = (args.length == 0) ? "test.in" : args[0];
try
{
Path path = Paths.get(input);
FileReader reader = new FileReader(input);
Scanner scanner = new Scanner(reader).useDelimiter("^\\s*$");
Stream<String> streamOfRecords = StreamSupport.stream(
Spliterators.spliteratorUnknownSize(scanner,
Spliterator.ORDERED), false);
List<String> result =
streamOfRecords
.map(l -> l.replaceAll("\n", " "))
.map(l -> l.replaceAll("\r", " "))
.map(String::trim)
.collect(Collectors.toList());
for(String s : result)
System.out.println("-> " + s);
} catch(Exception e)
{
System.out.println(e.toString());
}
}
}
输入可以是
this is
a
single record
here is the next record followed by a line with just a space
finally
our
last
record
我想看到类似的东西
-> this is a single record
-> here is the next record followed by a line with just a space
-> finally our last record
我不在乎记录中的单词之间有多少个空格,只要至少有 1 个即可。我确实让它适用于 useDelimiter("\n\n"),但如果空行有一个失败的空间。
最佳答案
您需要在分隔符正则表达式中设置多行模式。如果没有它, ^
和 $
仅检查完整文本内容的开头和结尾,而不是每行的开头和结尾。
您可以在正则表达式语句开头使用 (?m)
-flag 设置多行模式。
Scanner scanner = new Scanner(reader).useDelimiter("(?m)^\\s*$");
关于Java 流和多行记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56655536/