Scanner.next()和System.in.read()之间有什么区别?

时间:2015-08-30 08:25:25

标签: java input

我看到许多人使用java.lang.Scanner。

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

但是,我在一些书中提到了代码:

class Guess {
  public static void main(String args[])
  throws java.io.IOException {
    char ch, answer = 'K';
    System.out.println("I'm thinking of a letter between A and Z.");
    System.out.print("Can you guess it: ");
    ch = (char) System.in.read(); // read a char from the keyboard
    if(ch == answer) System.out.println("** Right **");
  }
}

我只想知道使用第一个示例和使用System.in.read()之间的区别。

谢谢!如果要在程序中添加用户输入,还需要抛出java.io.IOException吗?它做了什么?

4 个答案:

答案 0 :(得分:1)

这读取整数

int i = sc.nextInt();

e.g。如果你输入

1234

它将返回int1234

这会为您按下的每个键读取一个字符

char ch = (char) System.in.read();
char ch2 = (char) System.in.read();
char ch3 = (char) System.in.read();
char ch4 = (char) System.in.read();
char ch4 = (char) System.in.read();

如果你输入

1234<enter>

它会有

ch == '1'; // == 49
ch2 == '2'; // == 50
ch3 == '3'; // == 51
ch4 == '4'; // == 52
ch5 == '\n'; // == 10

答案 1 :(得分:0)

由于您的猜测必须是一个字符,因此使用第一个示例输入一个字符会抛出java.util.InputMismatchException,而且基本上扫描程序会在reading single characters中吮吸,即使第二个解决方案也有自己的缺陷并且不会工作尝试输入Katastrophe,对于IOException,方法System.in.read()抛出它,所以你要么抓住它,要么自己抛出它!

答案 2 :(得分:0)

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

在上面的情况下,我们在这里创建扫描器的对象(即sc),sc.nextInt()从用户获取输入,因此如果用户输入一个整数值,假设为'3',则该值存储到变量a;

在第二种情况ch = (char) System.in.read();这里System.in.read()读取您按下的键的字符并将其存储到变量ch中。您还可以使用扫描仪读取字符或字符串,如sc.next();,如果您必须读取带空格的字符串(例如“你好!!!”),那么您可以使用sc.nextLine()

答案 3 :(得分:0)

Scanner.next()和System.in.read()只是从“外部世界”(文件系统,控制台等)获取数据到程序的几种方法。
当java.lang.Scanner不仅能够读取单个符号而且读取整行时,System.in.read()只读取单个字符。

Scanner sc = new Scanner(System.in);

在上面的示例中,“sc”在其方法中使用System.in.read()。
你的例子之间的主要区别在于,在第一个例子中,Scanner调用System.in.read()本身,但在最后一个例程中,程序员显式调用它。
Java I / O是一个非常大的话题。你最好深入研究所有的概念。有些软件包包含IO功能:java.io,java.nio

大多数IO方法抛出IOException。这是一个已检查的异常,因此您必须在try-catch块中捕获它或在'throws'关键字后添加方法签名。