Java重用扫描程序

时间:2014-09-25 03:07:30

标签: java java.util.scanner

我正在尝试从txt文件中提取字符串,其匹配数据与下面的问题

当我尝试重复使用我的扫描仪时,它会占用所有资源并卡在页面中

String tmpStr1 = scanStr("Name :",streamData);
String tmpStr2 = scanStr("Email :",streamData); //it got stuck on this line

public String scanStr(String Str, String fileData){
    Scanner s = new Scanner(fileData);
    while (s.hasNextLine()) {
        try{
            s.findInLine(Str+" (\\S*)(.*)");
            if(s.match()!=null) { 
                MatchResult result = s.match();
                s.close();
                return result.group(1);
            }
            s.nextLine();
        } catch (IllegalStateException e){

        }
    }
    s.close();
    return "";
}

有什么方法可以解决这个问题吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

  1. 如果不匹配,您需要前进到下一行,nextLine().否则扫描仪的位置不变,您将永远扫描同一行。

  2. 如果没有匹配,
  3. Scanner.match()不会返回null。抛出IllegalStateException.见Javadoc。 Ergo为null测试它是毫无意义的。您应该测试的是findInLine()是否返回null.然后您可以摆脱catch (IllegalStateException ...)阻止。

  4. 返回""几乎总是一个坏主意,这也不例外。您应该返回null,表示不匹配。 ""表示名称或电子邮件地址。你需要能够区分这两者。

  5. 修订,也使用更好的变量名称:

    public static String scanStr(String prefix, String data)
    {
        try (Scanner s = new Scanner(data))
        {
            while (s.hasNextLine())
            {
                if (s.findInLine(prefix + " (\\S*)(.*)") != null)
                {
                    return s.match().group(1);
                }
                s.nextLine();
            }
            return null;
        }
    }
    

    此处没有扫描仪重复使用,也不存在。