在不同的类中创建两个扫描仪

时间:2014-03-07 07:28:58

标签: java java.util.scanner

我目前在我的项目中使用两个不同的扫描程序,分别是两个不同的类:用户输入执行不同的操作。调用第一台扫描仪工作正常,但是当我尝试调用第二台扫描仪时,即使我关闭了第一台扫描仪,它也会将输入注册为空。

第1类

Scanner scan = new Scanner(System.in);
public void foobar(){
    System.out.println("Enter data: ");
    String foo = scan.next();
    scan.close();
    class2.function(foo);
}

第2类

Scanner scan1 = new Scanner(System.in);
public void foobar1(String foo){
    System.out.println("Enter more data: ");
    String fooo = scan1.Next();
    //Automatically prints null here and closes program
}

我应该只以某种方式使用一台扫描仪吗?或者我以其他方式使用Scanner类?谢谢!

2 个答案:

答案 0 :(得分:3)

scan.close();也会关闭System.in,以便无法从流中读取更多数据。因此,当您从scan1开始阅读时,System.in将不再返回任何数据。

因此,如果您对所有实例使用相同的输入流,则在完成所有扫描之前不要关闭任何Scanner实例。

查看Scanner#close()的文档以获取更多信息。

  

关闭此扫描仪。 如果此扫描程序尚未关闭,那么如果其底层可读也实现了Closeable接口,则将调用可读的close方法。

如果您查看System.in的文档,就可以看到它确实实现了Closeable接口。

因此,InputStream#close()被调用并关闭InputStream而没有输入流来从中读取数据。

  

关闭此输入流并释放与该流关联的所有系统资源。

答案 1 :(得分:1)

无需创建两个扫描程序,您可以对两者使用相同的Scanner,因为一旦扫描关闭,流System.in也会关闭。 像:

Scanner scan = new Scanner(System.in);
public void foobar(){
    System.out.println("Enter data: ");
    String foo = scan.next();
    class2.function(foo,scan);
}

其中:

public void function(String foo,Scanner scan1){
    System.out.println("Enter more data: ");
    String fooo = scan1.next();
    System.out.println(fooo);
}

但如果您需要创建两个扫描程序,仍然可以在class1中使用scan.reset();而不是scan.close();