我正在尝试阅读多行文件。内容采用以下格式:( 0, 250, 6.4545, 250 )
我试过使用像
r = new FileInputStream ("Z:\\RTS\\HW2\\input.txt");
Scanner src = new Scanner(r);
src.useDelimiter("\\{(\\s),\\}+");
if(r!= null)
{
i=0;
while (src.hasNext())
{
System.out.println(src.nextInt()); // Line 84
if(src.hasNext())
a = (double)src.nextInt();
if(src.hasNext())
{
b = (double)src.nextInt();
period[i] = (int)b;
}
if(src.hasNext())
{
c = src.nextDouble();
exTime[i] = c;
}
if(src.hasNext())
d = src.nextDouble();
src.nextLine();
i++;
}
}
我收到以下例外情况:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at rm.rmcalc.main(rmcalc.java:84)
我认为不匹配可能是因为扫描仪功能无法识别分隔符。有人能告诉我,如果我在宣布分隔符时犯了错误吗?
答案 0 :(得分:0)
你在这里遇到了很多问题,其中最重要的是你的正则表达式完全是乱码。
\{(\s),\}+
您正在匹配文字{
,后跟空格和逗号,然后是另一个或多个文字}
。如果您尝试拆分逗号,通常只需要:
\s*,\s*
(Sidenote,Debuggex很棒,但它不是特定于Java的 - 我非常喜欢RegexPlanet's tool来玩Java模式。)
一旦你修好了分隔符,你仍然会遇到问题。您根本没有正确使用扫描仪。首先看一下Java Tutorial on Scanner。至少,您需要将.hasNext*()
来电与.next*()
来电相配,即在致电hasNextInt()
之前致电.nextInt()
。但是你也在做一堆复杂的条件处理,这些处理会以奇怪的方式导致格式错误的数据失败。
让我建议一种不同的模式,而不是引导你清理它。通常,当人们想要从文件中读取时,他们会使用两个单独的扫描仪。一个使用默认分隔符,他们只需在其上重复调用.nextLine()
。然后,他们将该行传递给具有自定义分隔符的第二个扫描程序,并逐行提取各个组件。这使您可以轻松地测试解析单行,因此您可以与文件读取行为分开调试行解析行为。