public abstract int read() throws IOException
-
从输入流中读取数据的下一个字节。返回
0
到255
范围内的int
字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1
。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。子类必须提供此方法的一个实现。
-
-
-
返回:
-
下一个数据字节;如果到达流的末尾,则返回
-1
。
-
下一个数据字节;如果到达流的末尾,则返回
官方的API可理解为:
当我们在屏幕中输入数据后,是直接放在缓冲区中,记录你每一次的输入,而System.in.read();的工作就是依次从这个缓冲区中读取下一个字符的ASCLL码。(System.in.read(); 这个方法一次只能接收一个输入的字符。)
//其中输出结果中绿色字体为键盘输入内容
例1:
package com.michael.io_test; public class IOTest2 { public static void main(String[] args) throws Exception { for (int j = 1; j !=0;) { System.out.println(System.in.read()); } } }
当输入23时,输出结果为:
23
50
51
13
10
分析:输出结果为4个,,第一个是2的ASCLL码, 第二个是3 的ASCLL码,第三个是回车键(\t) 的ASCLL码,第四个是换行(\n)的ASCLL码。
例2
当输入值为5时,输出结果为:package com.michael.io_test; import java.io.IOException; public class IOTest3 { public static void main(String[] args) throws IOException { int a = System.in.read(); System.out.println("a=" + a); int sum = 0; for (int i = 0; i <= a; i++) sum += i; System.out.println(sum); } }
5 1431
由于System.in.read()返回的是输入数值的 ASCII 码(一个 int 整数),所以输出5的ASCLL码53,从而1431为0-53的和。
如果要使得输出的值和输入的值一致,解决办法为:
采用BufferedReader,但是要注意的是BufferedReader读入的是一个字符串,所以我们在程序里面还要将其转换为Integer。代码如下:
输入5,输出结果为:package com.michael.io_test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class IOTest3 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int a = Integer.parseInt(br.readLine()); System.out.println("a = " + a); int sum = 0; for (int i = 0; i <= a; i++) { sum += i; } System.out.println(sum); } }
5
a = 5
15
例3:
输入为1,输出结果为:package com.michael.io_test; import java.io.IOException; public class IOTest1 { public static void main(String[] args) { for (int j = 0; j < 5; j++) { System.out.println("INPUT:"); char c = 0; try { c = (char) System.in.read(); } catch (IOException e) { } if (c == '1') { System.out.println("OK!"); } } } }
INPUT: 1 OK! INPUT: INPUT: INPUT:
![]()
分析:第二次循环时读到的字符其实是回车符\t,继续循环;第三次接受到的是换行符\n,也继续循环;第三次运行到输出INPUT处不动,等待输入。用System.in.read()时,我们在键盘上按下的任何一个键都会被当做是输入值,包括Enter键也会被当做是一个值!当我们按下Enter的时候,实际上发送两个键值:一个回车\t(13),一个是换行\n(10)。