为什么我们需要一个Scanner对象来获取java中的输入

wh6knrhe  于 2023-02-28  发布在  Java
关注(0)|答案(3)|浏览(139)

要打印输出,我们只需使用System.out流,而要获取输入,我们必须System.in在Scanner对象的构造函数中传递www.example.com,然后仅使用该对象。
为什么会这样呢?为什么没有像System.in.nextInt()这样的直接方法呢?

yruzcnhs

yruzcnhs1#

System.in 只是一个InputStream。一个很多年前设计的非常通用的接口。改变这个方面会破坏很多现有的代码。所以改变System.in的类型是不可行的。
另一方面,将scanner方法添加到流中会使现有的类膨胀。考虑一下诸如单一责任原则或关注点分离之类的概念。
你看,好的面向对象设计是关于拥有一个负责的小类,而不是两个,不是5个或10个。
但我认为您有一定的观点--如果Java今天被重写,那么输入流最终可能会更方便。

6pp0gazn

6pp0gazn2#

Scanner是一个在标准Java类库中定义的类,您可以使用它从控制台读取,如下所示:

Scanner sc = new Scanner(System.in);
    int i = sc.nextInt();

然而,这个构造器可以做更多的选择,例如,你可以从一个文件中读取,而不是像这样控制台:

Scanner sc = new Scanner(new File("myNumbers"));
  while (sc.hasNextLong()) {
      long aLong = sc.nextLong();
  }

所以基本上取决于构造器,你可以选择你想从哪里读取你的输入。
此外,在流中有多种表示整数的方法。Scanner.nextInt()将它们作为文本字符串读取。DataInputStream.readInt()将它们作为二进制数据读取。
如果你把它们弄混了,人会输入1234而得到825373492,或者计算机会输入825373492而得到1234。两者都会混淆。通过指定Scanner或DataInputStream,就不会有这样的意外或错误,因为你已经预先说明了“读取整数”的意思。
读这个:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

ovfsdjhp

ovfsdjhp3#

System.inSystem.out之间的一个重要区别是,尽管两者都是流,但其中一个流更特殊。

  • 字段摘要 *
static InputStream in
static PrintStream out

InputStream的对应物是OutputStream,但是Java设计者将类变量out设置为PrintStream,这就是为什么System.out的方法比System.in的方法更专业的原因。
至于为什么会这样,请看@GhostCat的回答。

相关问题