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

为什么我们需要一个Scanner对象来获取java中的输入,java,oop,stream,Java,Oop,Stream,要打印输出,我们只需使用System.out stream,而要获取输入,我们必须在扫描仪对象的构造函数中传递System.in,然后仅使用该对象 为什么会这样?为什么没有像System.in.nextInt()或类似的直接方法 System.in只是一个输入流。一个多年前设计的非常通用的界面。更改此方面将破坏许多现有代码。因此,更改System.in的类型是不可能的 另一方面,向流中添加scanner方法会使现有类膨胀。想想诸如单一责任原则或关注点分离之类的概念 你看,好的面向对象设计是关于有

要打印输出,我们只需使用System.out stream,而要获取输入,我们必须在扫描仪对象的构造函数中传递System.in,然后仅使用该对象


为什么会这样?为什么没有像System.in.nextInt()或类似的直接方法

System.in只是一个输入流。一个多年前设计的非常通用的界面。更改此方面将破坏许多现有代码。因此,更改System.in的类型是不可能的

另一方面,向流中添加scanner方法会使现有类膨胀。想想诸如单一责任原则或关注点分离之类的概念

你看,好的面向对象设计是关于有一个职责的小类。不是两个,不是5个或10个


但我认为您有一个特定的观点——如果Java今天被重写,那么输入流可能会更方便

System.in只是一个输入流。一个多年前设计的非常通用的界面。更改此方面将破坏许多现有代码。因此,更改System.in的类型是不可能的

另一方面,向流中添加scanner方法会使现有类膨胀。想想诸如单一责任原则或关注点分离之类的概念

你看,好的面向对象设计是关于有一个职责的小类。不是两个,不是5个或10个


但我认为您有一个特定的观点——如果Java今天被重写,那么输入流可能会更方便

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 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()
将它们作为文本字符串读取。将它们作为二进制数据读取

如果你把它们混在一起,人类会输入
1234
得到
825373492
,或者计算机会输入
825373492
得到
1234
。两者都会混淆。通过指定Scanner或DataInputStream,就不会有这样的意外或错误,因为您预先说明了“读取整数”的含义

请阅读以下内容:

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 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()
将它们作为文本字符串读取。将它们作为二进制数据读取

如果你把它们混在一起,人类会输入
1234
得到
825373492
,或者计算机会输入
825373492
得到
1234
。两者都会混淆。通过指定Scanner或DataInputStream,就不会有这样的意外或错误,因为您预先说明了“读取整数”的含义

请阅读以下内容:
系统in和
系统out
之间的一个重要区别是,尽管两者都是流,但其中一个流更专业。看看这个班:

现场总结

InputStream
的对应项是一个
OutputStream
,但是Java设计人员将类变量
out
a
PrintStream
。这就是为什么
System.out
的专用方法比
System.in
的专用方法更多的原因


至于为什么会出现这种情况,请参见@GhostCat的答案。

系统中的
系统中的
之间的一个重要区别是,尽管两者都是流,但其中一个流更专业。看看这个班:

现场总结

InputStream
的对应项是一个
OutputStream
,但是Java设计人员将类变量
out
a
PrintStream
。这就是为什么
System.out
的专用方法比
System.in
的专用方法更多的原因


至于为什么会出现这种情况,请参见@GhostCat的答案。

为什么这很重要?语言就是这样设计的。设计它的委员会或团队中的人做出了这个决定。某个地方也有人决定将该语言命名为Java
Scanner#nextInt()
是一种方便的方法,您可以轻松地从
系统中读取字节。在
中,无需
Scanner
对象。另外,
System
类是否应该拥有解析输入的所有可能方法,或者另一个类是否应该处理该任务并让
System
坚持它的本意,而不是过于臃肿。显然,您可以只使用
System.in.read()
,因此这个问题在当前状态下没有多大意义,既然你根本不需要扫描仪,那又有什么关系呢?语言就是这样设计的。设计它的委员会或团队中的人做出了这个决定。某个地方也有人决定将该语言命名为Java
Scanner#nextInt()
是一种方便的方法,您可以轻松地从
系统中读取字节。在
中,无需
Scanner
对象。另外,
System
类是否应该拥有解析输入的所有可能方法,或者另一个类是否应该处理该任务并让
System
坚持它的本意而不是臃肿。显然,您可以只使用
System.in.read()
,所以这个问题在当前统计中没有多大意义