Java 如何重复使用扫描仪?

Java 如何重复使用扫描仪?,java,java.util.scanner,Java,Java.util.scanner,我用一个方法创建了一个实用类,该方法接受用户输入,并返回它的小写版本,因此我没有太多重复代码,但它只能使用一次。之后,它就不会扫描了。我能做些什么来解决这个问题 p、 我看到很多人说重复使用扫描仪是个坏主意。为什么会这样?如果扫描器被重置,那不是很好吗 public String scan() { String input; Scanner s = new Scanner(System.in); if (s.hasNextLine()) { input =

我用一个方法创建了一个实用类,该方法接受用户输入,并返回它的小写版本,因此我没有太多重复代码,但它只能使用一次。之后,它就不会扫描了。我能做些什么来解决这个问题

p、 我看到很多人说重复使用扫描仪是个坏主意。为什么会这样?如果扫描器被重置,那不是很好吗

public String scan() {
    String input;
    Scanner s = new Scanner(System.in);
    if (s.hasNextLine()) {
        input = s.nextLine();
    } else {
        input = "ERROR";
    }
    s.reset();
    s.close();
    return input.toLowerCase();
}

每次使用扫描仪时,您都是正确的,因为它会被重置。您的问题的解决方案如下:


在数组中添加要传递给
scan()
的所有参数,并在返回时使用
for
循环将它们全部传递给
scan()
,将它们再次添加到各自的阵列位置,这样您就可以方便地在任何地方重复使用它们。

您实际上可以重复使用扫描仪,而不是每次需要读取一行时都创建一个新的扫描仪,下面是一个示例:

public class Test {
    public static void main(String[] args) {
        Test t = new Test();
        //create your scanner object
        Scanner s = new Scanner(System.in);
        //send it as a parameter whenever you need to read a line
        System.out.println(t.scan(s));
        System.out.println(t.scan(s));
        System.out.println(t.scan(s));
        //close it after finishing
        s.close();
    }

    public String scan(Scanner s) {
        String input;
        if (s.hasNextLine()) {
        input = s.nextLine();
        } else {
           input = "ERROR";
        }
        return input.toLowerCase();
     }
}
但是,如果您为自己创建了一个reader实用程序类,那么在实用程序类中作为实例变量更符合逻辑

例如:

public class Reader {
    Scanner s ;

    public Reader() {
        s = new Scanner(System.in);
    }

    public String scan() {
        String input;
        if (s.hasNextLine()) {
            input = s.nextLine();
        } else {
            input = "ERROR";
        }
        return input.toLowerCase();
    }

    public void close(){
        s.close();
    }
}
当你使用它时,它会是这样的:

public class Main {
    public static void main(String[] args) {
        //create your scanner object
        Reader r = new Reader();
        //send it whenever you need to read a line
        System.out.println(r.scan());
        System.out.println(r.scan());
        System.out.println(r.scan());
        //close it after finishing
        r.close();
    }
}

为什么要重复使用扫描仪?我觉得你的方法很好。将扫描仪的输入数据保存在内存中,然后重新使用数据,而不是扫描仪。如果以后有更多输入,请使用新的扫描仪。@TimBiegeleisen我将多次调用该方法,因此必须再次使用扫描仪。除非有更好的办法,否则我不知道how@waltersu你把它存到内存里是什么意思?你说要重用哪些数据?对不起,我对Java非常陌生重复使用扫描仪是个坏主意?创建数百个扫描仪来读取数百行是更好的主意吗?当然,您可以重用它,例如将行放在数组中。但您的代码和我的代码之间到底有什么区别?我看到s=新扫描仪(System.in);与扫描方法不在同一方法中,但这会如何改变情况,以及如何修复我做错的事情?顺便说一句,thx更新后的答案正是我想要的。为了解释这个场景,如果你需要阅读100万行,那么我们需要100万次对扫描函数的调用,这是常见的事情,现在的区别是你的代码将创建一个扫描对象->然后在阅读该行后将关闭流,这种情况也会发生100万次,这显然是不必要的开销。。在我的代码中,只为整个读取过程创建了一个扫描仪对象,在读取过程结束时创建了一个关闭操作。