【问题标题】:Scanner only works with one out of multiple classes JavaScanner 仅适用于 Java 多个类中的一个
【发布时间】:2015-03-28 23:34:05
【问题描述】:

我有一个程序,用于分析用户通过在提示时输入文本文件的完整路径来选择的文本文件。

我已设法将扫描仪分为多个类,但它不会同时适用于每种方法。例如,我有一个类将打印文件中的数字数量,另一个类将打印文件中的字数。然而,只有第一个运行的方法会起作用,另一个将显示类正在搜索的任何内容(数字、行、单词等)的 0,即使真实值实际上不是 0。

我真的很困惑为什么会发生这种情况,我已将主类与其他两个类附加在一起以显示一个清晰的示例:

主类:

package cw;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JFileChooser;
import java.io.IOException;

public class TextAnalyser {
public static Scanner reader;
    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter a filename");
        String filename = in.nextLine();
        File InputFile = new File (filename);
        reader = new Scanner (InputFile);


        LineCounter Lineobject = new LineCounter();
        WordCounter Wordobject = new WordCounter();


        Lineobject.TotalLines();
        Wordobject.TotalWords();

    }

}

计算行数的类:

package cw;

import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JFileChooser;
import java.io.IOException;

public class LineCounter {


    public static void TotalLines() throws IOException {
       // Scanner sc = new Scanner(TextAnalyser.class.getResourceAsStream("test.txt"));
                      Scanner sc = TextAnalyser.reader;

        PrintWriter out = new PrintWriter(new FileWriter("C:\\Users\\Sam\\Desktop\\Report.txt", true));
        int linetotal = 0;
        while (sc.hasNextLine()) {
            sc.nextLine();
            linetotal++;
        }
         out.println("The total number of lines in the file = " + linetotal);

             out.flush();

            out.close();
         System.out.println("The total number of lines in the file = " + linetotal);
    }
}

单词计数类:

package cw;

import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JFileChooser;
import java.io.IOException;

public class WordCounter {
                     public static  Scanner sc = TextAnalyser.reader;

    public static void TotalWords() throws IOException{
        //Scanner sc = new Scanner(TextAnalyser.class.getResourceAsStream("test.txt"));
        PrintWriter out = new PrintWriter(new FileWriter("C:\\Users\\Sam\\Desktop\\Report.txt", true));
        int wordtotal = 0;

  while (sc.hasNext()){
     sc.next();
      wordtotal++;
  }
    out.println("The total number of words in the file = " + wordtotal);
    out.flush();

            out.close();

  System.out.println("The total number of words in the file = " + wordtotal);
}
}

由于某种原因,一次只能工作一个,总是说有 0 个,如果有人可以向我解释为什么会发生这种情况以及如何解决它,那真的很有帮助,谢谢!

【问题讨论】:

  • 你在哪里使用Scanner readerTextAnalyser 是什么?
  • TextAnalyser 是主类的名称,reader 在里面声明。
  • 哦,对不起,我很困惑..让我再看看。

标签: java class java.util.scanner


【解决方案1】:

reader = new Scanner (InputFile); 包含对 Scanner 对象的引用,当您在两种方法中使用public static Scanner sc = TextAnalyser.reader; 时,您会将reader 的引用复制到sc,因此它们都是同一个对象。为什么有 2 个变量引用所有相同的对象,其中一个被重新定义两次并具有相同的值?

这里的问题是扫描仪到达了文件的末尾,当你再次调用它时(它是同一个对象)它没有更多要读取的东西,所以你应该创建另一个扫描仪对象(也许它就是你的试图做什么?)。更好的解决方案是读取文件一次并将内容存储在某个数据结构中。

【讨论】:

  • 所以如果我为每个班级制作了一个不同的扫描仪都读取同一个文件,我的问题应该得到解决吗?
  • 也许这不是最好的解决方案,但是是的,它会起作用。
  • 好的,我知道它会起作用,但是说我只是想将整个文件读入一个字符串,这只是String file = inputfile; 的问题吗?
  • 将它放入字符串并不容易,您需要某种缓冲区或类似这样的函数:stackoverflow.com/a/16027293/1871058 广告您应该重新定义您的 WordCounterLineCounter 类相应地。
猜你喜欢
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多