Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带扫描程序的多个分隔符_Java_Java.util.scanner_Delimiter - Fatal编程技术网

Java 带扫描程序的多个分隔符

Java 带扫描程序的多个分隔符,java,java.util.scanner,delimiter,Java,Java.util.scanner,Delimiter,我正在尝试读取多行文件。内容的格式如下:(0,250,6.4545250) 我尝试使用use.Delimiter()函数,如下所示 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.

我正在尝试读取多行文件。内容的格式如下:
(0,250,6.4545250)
我尝试使用use.Delimiter()函数,如下所示

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)

我认为不匹配可能是因为scanner函数无法识别分隔符。有人能告诉我在声明分隔符时是否出错吗?

这里有很多问题,其中最重要的一点是您的正则表达式完全乱码了

\{(\s),\}+

您正在匹配一个literal
{
,后跟一个空格和一个逗号,然后是另一个或多个literal
}
s。如果您试图使用逗号拆分,通常只需:

\s*,\s*

(旁注,Debuggex很棒,但它不是Java特有的——我非常喜欢玩Java模式。)


但是,一旦您修复了分隔符,您仍然会遇到问题。您根本没有正确使用扫描仪。看看第一个。至少,您需要将
.hasNext*()
调用与
.next*()
调用配对,即在调用
.nextInt()之前调用
hasNextInt()
。但您也在进行一系列复杂的条件处理,对于格式错误的数据,这些处理将以奇怪的方式失败


让我建议一种不同的模式,而不是带你去清理。通常,当人们想要读取文件时,他们使用两个独立的扫描仪。一个使用默认的分隔符,他们只需重复调用
.nextLine()
。然后,他们用自定义分隔符将该行传递到第二个扫描仪,并逐行提取各个组件。这使您可以轻松地测试解析一行,这样您就可以将行解析行为与文件读取行为分开调试。

我不确定是否完全遵循了这一点。使用nextDouble读取具有浮点值(6.4545)的字段。这不应该造成不匹配,对吗?