gpt4 book ai didi

java - 构造 java.util.Scanner 的意外行为

转载 作者:行者123 更新时间:2023-12-05 09:35:15 25 4
gpt4 key购买 nike

我有以下文件 lines.txt

Line1
Line2
Line3

我正在使用扫描仪逐行解析此文件的内容。我在 LinesReader.java 中有以下设置

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Line {
Line(String content) {
this.content = content;
}
public String content;

public String toString() {
return content;
}
}

public class LinesReader {
public static Line buildLine(InputStream is) {
Scanner scanner = new Scanner(is);
if (scanner.hasNextLine()) {
return new Line(scanner.nextLine());
}
return null;
}
public static Line buildLine(Scanner scanner) {
if (scanner.hasNextLine()) {
return new Line(scanner.nextLine());
}
return null;
}

public static void main(String[] args) throws FileNotFoundException {
List<Line> lines = new ArrayList<>();
Line line = null;
FileInputStream is = new FileInputStream("lines.txt");
// buildLine(scanner) works as expected
while ((line = buildLine(is)) != null) {
lines.add(line);
}

System.err.println(lines);
}
}

输出是

[Line1]

预期的输出是

[Line1, Line2, Line3]

我了解扫描仪实现了 AutoCloseable,但根据 documentation那只会申请一个try-with-resources 构造而不是此处。另外,当我调试时,它说底层流​​是打开的。第二次调用 scanner.hasNextLine() 意外失败。

如果我在 main() 中构建一次扫描器,它会按预期工作。

我的java版本是1.8.0_275

作为对@Sweeper 的评论的回应,扫描仪似乎缓冲了比消耗的更多的东西,文档有点矛盾。

对于 hasNextLine()

The scanner does not advance past any input.

对于 nextLine()

Since this method continues to search through the input looking for a line separator, it may buffer all of the input searching for the line to skip if no line separators are present.

强调我的。

最佳答案

hasNextLine() 的文档

The scanner does not advance past any input.

有点误导。它不会推进扫描器的内部缓冲区,这是显而易见的,但会读取几千字节的流。

在这种情况下,整个流都被 hasNextLine() 消耗。

我个人认为这是Scanner实现的一个缺陷。 Scanner 的设计目的是为了方便和简单,而不是为了性能。将 InputStream 包装在 BufferedInputStream 中是明智的,并使使用更简单。

关于java - 构造 java.util.Scanner 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65953905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com