关于可以重新使用java Scanner的简单问题?

时间:2015-02-18 19:21:03

标签: java java.util.scanner

我还是java的新手,是否可以重新使用Scanner对象? 下面的例子是我正在读一个文件来做字符,单词和行数。我知道必须有一个更好的方法只使用一个扫描仪对象进行计数,但这不是主要观点。我只是想知道为什么有input.close()但没有input.open()input.reset等等。因为我实际上正在读同一个文件,是否可以只创建一个Scanner对象并传递3个方法用吗?谢谢

public class Test {

    /**
     * @throws java.io.FileNotFoundException
     */
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("demo.java");
        Scanner input = new Scanner(file);
        Scanner input2 = new Scanner(file);
        Scanner input3 = new Scanner(file);
        int lines = 0;
        int words = 0;
        int characters = 0;

        checkCharacters(input3);
        checkLines(input);
        checkwords(input2);

    }

    private static void checkLines(Scanner input) {
        int count = 0;
        while (input.hasNext()) {

            String temp = input.nextLine();
            String result = temp;
            count++;
        }
        System.out.printf("%d lines \n", count);
    }

    private static void checkwords(Scanner input2) {
        int count = 0;
        while (input2.hasNext()) {
            String temp = input2.next();
            String result = temp;
            count++;
        }
        System.out.printf("%d words \n", count);
    }

    private static void checkCharacters(Scanner input3) {
        int count = 0;
        while (input3.hasNext()) {
            String temp = input3.nextLine();
            String result = temp;
            count += temp.length();
        }
        System.out.printf("%d characters \n", count);
    }
}

2 个答案:

答案 0 :(得分:1)

不,无法从扫描仪上的方法重置扫描仪。如果您将InputStream传入扫描仪,然后直接重置流,但我认为这不值得,您可以这样做。

您似乎正在解析同一个文件3次并处理相同的输入3次。这似乎是浪费处理。你不能一次完成所有3个计数吗?

private static int[] getCounts(Scanner input) {

   int[] counts = new int[3];

   while(input.hasNextLine()){
      String line = input.nextLine();
      counts[0]++; // lines

      counts[2]+=line.length(); //chars

      //count words
      //for simplicity make a new scanner could probably be better
      //using regex or StringTokenizer
      try(Scanner wordScanner = new Scanner(line)){
           while (wordScanner.hasNext()) {
               wordScanner.next();
               count[1] ++;  //words
           }
      }
   }

   return counts;

}

当然,面向对象的方式是返回一个名为Counts的新对象,其方法为getNumLines()getNumChars()等。

修改

有一点需要注意,我保持计算与原始问题中的计算相同。我不确定计数是否总是准确的,特别是字符,因为扫描仪可能不会返回所有行结束字符所以字符数可能会关闭,如果有连续的空白行,可能会关闭行数?你需要测试一下。

答案 1 :(得分:0)

不可能,因为documentation

void close()
           throws IOException
  

关闭此流并释放与之关联的所有系统资源   它。如果流已经关闭,则调用此方法没有   效果。

一旦resourcerelaesed,就无法取回它,直到你有一个对它的引用,实际上是关闭的