【发布时间】:2018-06-11 20:15:57
【问题描述】:
我正在尝试使用扫描仪读取字符串标记的 InputStream。每个令牌都以逗号 , 结尾。空字符串"" 也是有效令牌。在这种情况下,整个标记只是结束它的逗号。
InputStream 是从另一个进程缓慢读取的,任何令牌都应在完全读取后立即处理。因此,将整个 InputStream 读取到 String 是不可能的。
示例输入可能如下所示:
ab,,cde,fg,
如果我将 Scanner 的分隔符设置为逗号,它似乎可以很好地处理这项工作。
InputStream input = slowlyArrivingStreamWithValues("ab,,cde,fg,");
Scanner scan = new Scanner(input);
scan.useDelimiter(Pattern.quote(","));
while (scan.hasNext()) {
System.out.println(scan.next());
}
输出:
ab
cde
fg
但是,当流以空标记开始时,就会出现问题。出于某种原因,如果第一个令牌为空,则 Scanner 会忽略它。
/* begins with empty token */
InputStream input = slowlyArrivingStreamWithValues(",ab,,cde,fg,");
...
输出:
ab
cde
fg
为什么 Scanner 会忽略第一个令牌?我怎样才能包含它?
【问题讨论】:
-
附带说明,如果您尝试实现 CSV 解析器,请停止。那里有无穷无尽的解析器(apache-csv,仅举一个例子)。在某些极端情况下,它会变得非常非常复杂。