java.io.InputStream.read() 是如何工作的?

How does java.io.InputStream.read() work?

为什么会这样:

import java.io.*;

class ioTest2 {
  public static void main(String args[])throws IOException{
      int b;
      while( (b = System.in.read() ) != -1)
          System.out.print((char)b);
  }
}

按预期工作,即准确打印您键入的内容,并且:

import java.io.*;

class ioTest2 {
  public static void main(String args[])throws IOException{
    int b;
    while( (b = System.in.read() ) != -1)
        System.out.print(b);
  }
}  

不会吧?为什么我将 b 强制转换为字符以使代码正确?

read() method returns int 存储从流中读取的下一个字节。您需要将其转换为 char,否则将打印 int 值。

如果您键入 "ABCD",则不进行转换,然后调用 println(int) methodSystem.outPrintStream),并打印字节的值.

  B   D
  vv  vv
65666768
^^  ^^
A   C

如果你将它转换为 char,那么会调用一个不同的重载方法 println(char),它知道打印指定的字符,所以它 "works"(回应你您输入的字符)。

read() 方法 returns an integer,如果已到达流末尾则为 -1。

一个char,或字符,是一个primitive type,可以表示为一个数字。由于您将整数转换为字符,因此它会显示在屏幕上。

System.out.print((char)b)System.out.print(b) 调用 不同的方法 。他们做不同的事情。

调用哪个方法不仅取决于名称,还取决于名称和类型签名(即,由参数的类型)。不同的方法可以有相同的名称,只要它们有不同的参数列表。

阅读 JavaDoc:

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#print%28int%29

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#print%28char%29