我编写了以下代码来打印文件内容并打印文件中的字符和单词数
import java.io.*;
import java.util.*;
class Ass53
{
public static void main(String args[]) throws Exception
{
File file=new File("sample.txt");
Scanner sc=new Scanner(new FileInputStream(file));
String line,line1;
int count1=0;
int count=0;
/*Loop for printing contents of file*/
while(sc.hasNextLine())
{
line=sc.nextLine();
System.out.println(line);
}
/*loop for counting number of character in file*/
while(sc.hasNext())
{
line1=sc.next();
for(int i=1;i<=line1.length();i++)
count1++;
}
System.out.println(count1);
/*loop for counting number of words in a file*/
while(sc.hasNext())
{
sc.next();
count++;
}
System.out.println("Number of words: " + count);
}
}
问题是只有第一个while循环正在执行。我猜这个原因可能是第一个while循环的sc.nextLine。首先,while循环sc指向什么我猜?
有什么办法可以解决吗? 我希望我的另一个while循环也能正常工作
答案 0 :(得分:2)
每当您执行nextLine()
时,您都会使扫描仪超过当前行。当第一个循环结束时,您就在文件的末尾,没有任何东西可以扫描。
解决方案是在每次循环之前重新创建扫描仪。只需在第二和第三while
之前重复此操作:
sc=new Scanner(new FileInputStream(file));
另一个解决方案涉及更多工作但更优雅:使用单个循环将所有行存储在List<String>
中,然后分析所有行以计算单词和字符。
答案 1 :(得分:1)
每次循环完成后,您需要将sc设置回流的开头。
我不会发布代码,因为这看起来像家庭作业,我猜测类名Ass53是“Assignment53”。查找并弄清楚如何将流设置回到开头应该不会太难。
你可以尝试将它组合成一个循环,因为它现在正好,你实际上读了3次同一个文件。如果它是一个小文件可能不是那么糟糕,但如果它是一个较大的文件会很慢。
答案 2 :(得分:1)
第一个循环说“直到我用完文件中的行,读取行并打印出来。”然后第二个循环在文件中查找更多字符,当然没有任何内容。
一种选择是在每次循环之前重置扫描仪。在第一次循环之后的每个循环之前,只需关闭并丢弃扫描仪,然后创建一个新的。
但是,还有更好的方法。您可以逐个字符地浏览文件(例如,使用BufferedReader),并增加每个字符的字符数,以及每个换行符上的换行计数。不要忘记考虑不以换行符结尾的文件。只需要一个循环,并且您已经计算了总字符数和行数。