如何在java中正确结束长度不确定的循环时的文件扫描程序
我编写了一个函数,用于扫描以制表符分隔的棒球统计数据文件如何在java中正确结束长度不确定的循环时的文件扫描程序,java,Java,我编写了一个函数,用于扫描以制表符分隔的棒球统计数据文件 public static ArrayList dataRead() throws FileNotFoundException { //ArrayList array = new ArrayList<ArrayList>(); Scanner s = new Scanner(new File("c:\\stats.txt")).useDelimiter("\r"); ArrayList<Stri
public static ArrayList dataRead() throws FileNotFoundException {
//ArrayList array = new ArrayList<ArrayList>();
Scanner s = new Scanner(new File("c:\\stats.txt")).useDelimiter("\r");
ArrayList<String> array = new ArrayList<String>();
int i = 0;
while(s.next() != null) {
String currentLine = s.next();
Scanner split = new Scanner(currentLine).useDelimiter("\t");
for(int j = 0; j < 16; j++) {
System.out.print(split.next() + " ");
j++;
}
System.out.println("\r");
}
s.close();
return array;
}
publicstaticarraylistdataread()抛出FileNotFoundException{
//ArrayList数组=新的ArrayList();
扫描仪s=新扫描仪(新文件(“c:\\stats.txt”))。使用分隔符(“\r”);
ArrayList数组=新的ArrayList();
int i=0;
while(s.next()!=null){
字符串currentLine=s.next();
扫描仪拆分=新扫描仪(currentLine).useDelimiter(“\t”);
对于(int j=0;j<16;j++){
System.out.print(split.next()+);
j++;
}
System.out.println(“\r”);
}
s、 close();
返回数组;
}
此函数一直工作到文件结束。据我所知,while循环应该在文件末尾关闭,因为它返回null,但我一直得到一个nosucheelement错误。如果我能保证文件的大小,我只会使用一个大小为的for循环,但我不能,因为团队的大小在技术上可能会有所不同。如何在循环时正确结束文件扫描程序,以便关闭扫描程序?来自:
抛出:
NoTouchElementException-如果没有更多可用令牌
当文件中没有多余的行时,调用s.next()
将抛出NoTouchElementException
异常。您还将调用s.next()
两次,一次在while()中,一次在循环中。您确实应该在(s.hasNext())时被调用。来自:
抛出:
NoTouchElementException-如果没有更多可用令牌
当文件中没有多余的行时,调用
s.next()
将抛出NoTouchElementException
异常。您还将调用s.next()
两次,一次在while()中,一次在循环中。实际上应该在调用(s.hasNext())时调用您。for循环有两个问题:
j<16
?如果一行中的令牌少于16个,则将出现错误。请考虑使用while循环,使用<代码>分裂.HasNeXT()/<代码>条件,与外部while循环类似。j
增加两次——一次在for循环的声明中,一次在相同for循环的be体中需要更正外部while循环以使用
hasNext()
而不是next()!=null
for循环有两个问题:
j<16
?如果一行中的令牌少于16个,则将出现错误。请考虑使用while循环,使用<代码>分裂.HasNeXT()/<代码>条件,与外部while循环类似。j
增加两次——一次在for循环的声明中,一次在相同for循环的be体中hasNext()
而不是next()!=空
只需执行以下操作:
while(s.hasNext())
{
//blah
}
还可以使用StringTokenizer
,而不是for loop
for令牌
StringTokenizer str = new StringTokenizer(currentLine,"\t");
while(str.hasMoreTokens)
{
System.out.print(str.nextToken());
}
只要做:
while(s.hasNext())
{
//blah
}
还可以使用StringTokenizer
,而不是for loop
for令牌
StringTokenizer str = new StringTokenizer(currentLine,"\t");
while(str.hasMoreTokens)
{
System.out.print(str.nextToken());
}
不要使用
scanner.next()
在循环条件中使用scanner.hasNext()
检查是否有新元素,而不要使用scanner.next()
在循环条件中使用scanner.hasNext()
检查是否有新元素在while条件下。如果下一个令牌存在,它将返回true,否则返回false
while(s.hasNext()){
}
可以在while条件下使用s.hasNext()。如果下一个令牌存在,它将返回true,否则返回false
while(s.hasNext()){
}
我得到了它。每行的长度为17个标记。行数是可变的。我注意到在我发布后大约两秒钟,我忘了使用hasNext而不是next。我明白了。每行的长度为17个标记。行数是可变的。我注意到我在发布后大约两秒钟忘了使用hasNext而不是next。几分钟后就收到了,现在还不允许自己回答。谢谢你的关心:)一会儿就收到了,还不允许自己回答。谢谢你的关心:)