在java中计算文件中的单词和字符数时出错

时间:2013-02-24 18:27:06

标签: java

我编写了以下代码来打印文件内容并打印文件中的字符和单词数

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循环也能正常工作

3 个答案:

答案 0 :(得分:2)

每当您执行nextLine()时,您都会使扫描仪超过当前行。当第一个循环结束时,您就在文件的末尾,没有任何东西可以扫描。

解决方案是在每次循环之前重新创建扫描仪。只需在第二和第三while之前重复此操作:

sc=new Scanner(new FileInputStream(file));

另一个解决方案涉及更多工作但更优雅:使用单个循环将所有行存储在List<String>中,然后分析所有行以计算单词和字符。

答案 1 :(得分:1)

每次循环完成后,您需要将sc设置回流的开头。

我不会发布代码,因为这看起来像家庭作业,我猜测类名Ass53是“Assignment53”。查找并弄清楚如何将流设置回到开头应该不会太难。

你可以尝试将它组合成一个循环,因为它现在正好,你实际上读了3次同一个文件。如果它是一个小文件可能不是那么糟糕,但如果它是一个较大的文件会很慢。

答案 2 :(得分:1)

第一个循环说“直到我用完文件中的行,读取行并打印出来。”然后第二个循环在文件中查找更多字符,当然没有任何内容。

一种选择是在每次循环之前重置扫描仪。在第一次循环之后的每个循环之前,只需关闭并丢弃扫描仪,然后创建一个新的。

但是,还有更好的方法。您可以逐个字符地浏览文件(例如,使用BufferedReader),并增加每个字符的字符数,以及每个换行符上的换行计数。不要忘记考虑不以换行符结尾的文件。只需要一个循环,并且您已经计算了总字符数和行数。