我正在尝试从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 "";
}
有什么方法可以解决这个问题吗?非常感谢。
答案 0 :(得分:1)
如果不匹配,您需要前进到下一行,nextLine().
否则扫描仪的位置不变,您将永远扫描同一行。
Scanner.match()
不会返回null
。抛出IllegalStateException.
见Javadoc。 Ergo为null
测试它是毫无意义的。您应该测试的是findInLine()
是否返回null.
然后您可以摆脱catch (IllegalStateException ...)
阻止。
返回""
几乎总是一个坏主意,这也不例外。您应该返回null,
表示不匹配。 ""
表示空名称或电子邮件地址。你需要能够区分这两者。
修订,也使用更好的变量名称:
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;
}
}
此处没有扫描仪重复使用,也不存在。