为什么 readline 不读取每一行
Why is readline not reading every line
我正在尝试(使用 Regex)在一个大文本文件中查找第一行 'False' 而不是 'True'。有多行是这种情况。
文本文件示例:
test, test, test, True,
test, test, test, True,
test, test, test, False, (i want this line)
test, test, test, False,
test, test, test, True,
test, test, test, True,
test, test, test, False,(and that)
test, test, test, False,
test, test, test, True,
test, test, test, True,
我正在逐行阅读文件。始终当读取的行与 'True' 正则表达式匹配时,它会读取下一行并尝试下一行是否与 'False' 正则表达式匹配。如果是这样(现在),它应该给我打印这条线。
try {
BufferedReader br =
new BufferedReader(new FileReader(C:\Directory\test.txt)
String lineRead;
while ((lineRead = br.readLine()) != null) {
if(lineRead.matches( ".*True.*")){
if((lineRead = br.readLine()) != null){
if((lineRead.matches( ".*False.*"))){
System.out.println(lineRead);
}
}
}
}
}
它给了我大部分台词,但不是全部。这些行相隔几千行。 'False' 行总是跟进数百行。所以 'overjumping' 应该没有问题。
你问题的格式绝对是一团糟,但这就是你真正需要的:
boolean flag = false;
while ((lineRead = br.readLine()) != null) {
if (lineRead.matches(".*\bTrue\b.*")) {
flag = true;
}
else if (lineRead.matches(".*\bFalse\b.*")) {
if (flag) {
System.out.println(lineRead);
flag = false;
}
}
}
布尔值flag
跟踪上一行的状态。如果它是前一个 true 行之后的第一个 false 行,我们只打印包含 false 的行。并且,在解析错误行之后,我们将标志设置为 false,以防止打印第二行以后的错误行。
另一个更简单、更简洁的解决方案如下:
private static void findFalse() {
try(var stream = Files.lines(Paths.get(PATH))) {
stream.filter(PATTERN.asPredicate())
.forEach(System.out::println);
} catch (IOException e) {
System.err.println("An error has occurred:: " + e.getMessage());
}
}
首先像这样定义一个 Pattern
:
private static final Pattern PATTERN = Pattern.compile(".*\bFalse\b.*");
然后简单地打开文件行流,使用您定义的模式进行过滤,并将每个匹配行输出到标准输出。
这样您就可以避免设置标志以及手动处理整个阅读过程。
通过你的原始代码,以你给出的例子,我明白了。
第 5 行:读取输入第 1 行
第 6 行:通过,因此读取输入行 2
第 7 行:失败
第 5 行:读取输入第 3 行
第 6 行:失败
第 5 行:读取第 4 行
...
因此,第一组 'False' 行不会显示,类似地,任何一组由 2 'True' 行分隔的假行。
我正在尝试(使用 Regex)在一个大文本文件中查找第一行 'False' 而不是 'True'。有多行是这种情况。
文本文件示例:
test, test, test, True, test, test, test, True, test, test, test, False, (i want this line) test, test, test, False, test, test, test, True, test, test, test, True, test, test, test, False,(and that) test, test, test, False, test, test, test, True, test, test, test, True,
我正在逐行阅读文件。始终当读取的行与 'True' 正则表达式匹配时,它会读取下一行并尝试下一行是否与 'False' 正则表达式匹配。如果是这样(现在),它应该给我打印这条线。
try {
BufferedReader br =
new BufferedReader(new FileReader(C:\Directory\test.txt)
String lineRead;
while ((lineRead = br.readLine()) != null) {
if(lineRead.matches( ".*True.*")){
if((lineRead = br.readLine()) != null){
if((lineRead.matches( ".*False.*"))){
System.out.println(lineRead);
}
}
}
}
}
它给了我大部分台词,但不是全部。这些行相隔几千行。 'False' 行总是跟进数百行。所以 'overjumping' 应该没有问题。
你问题的格式绝对是一团糟,但这就是你真正需要的:
boolean flag = false;
while ((lineRead = br.readLine()) != null) {
if (lineRead.matches(".*\bTrue\b.*")) {
flag = true;
}
else if (lineRead.matches(".*\bFalse\b.*")) {
if (flag) {
System.out.println(lineRead);
flag = false;
}
}
}
布尔值flag
跟踪上一行的状态。如果它是前一个 true 行之后的第一个 false 行,我们只打印包含 false 的行。并且,在解析错误行之后,我们将标志设置为 false,以防止打印第二行以后的错误行。
另一个更简单、更简洁的解决方案如下:
private static void findFalse() {
try(var stream = Files.lines(Paths.get(PATH))) {
stream.filter(PATTERN.asPredicate())
.forEach(System.out::println);
} catch (IOException e) {
System.err.println("An error has occurred:: " + e.getMessage());
}
}
首先像这样定义一个 Pattern
:
private static final Pattern PATTERN = Pattern.compile(".*\bFalse\b.*");
然后简单地打开文件行流,使用您定义的模式进行过滤,并将每个匹配行输出到标准输出。
这样您就可以避免设置标志以及手动处理整个阅读过程。
通过你的原始代码,以你给出的例子,我明白了。
第 5 行:读取输入第 1 行
第 6 行:通过,因此读取输入行 2
第 7 行:失败
第 5 行:读取输入第 3 行
第 6 行:失败
第 5 行:读取第 4 行
...
因此,第一组 'False' 行不会显示,类似地,任何一组由 2 'True' 行分隔的假行。