Java 数据输入流混淆
为什么在运行这段代码时,如果将3作为输入,它不会向控制台写入Print,但33会写入PrintJava 数据输入流混淆,java,input,stream,Java,Input,Stream,为什么在运行这段代码时,如果将3作为输入,它不会向控制台写入Print,但33会写入Print public static void main(String[] args) throws Exception { DataInputStream input; int any; input = new DataInputStream(System.in); any = input.readInt(); System.out.println("Print");
public static void main(String[] args) throws Exception
{
DataInputStream input;
int any;
input = new DataInputStream(System.in);
any = input.readInt();
System.out.println("Print");
}
因为InputStream读取的是字节,而不是字符
readInt将读取4个字节来构造一个int。但您的输入3只有1个字节0x33。添加行拆分器\r\n0x0d0a,只有3个字节无法构造int。您可以重试输入,它将打印
但正确的方法是以char方式读取char。您可以使用读卡器或扫描仪
当提示输入时,按键盘上的Enter键会追加换行符。因此,键入333并按Enter键将生成存储在any中的以下值:858993418
查看DataInputStreamreadInt的源代码,我们可以看到以下内容:
public final int readInt() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}
('3' << 24) + ('3' << 16) + ('3' << 8) + '\n'
我不知道你为什么说33行得通,因为只输入33并按Enter键并不能为DataInputStream提供四个字节,所以它会继续等待另一个字节。您可以按Enter键两次,它将打印出来。您的IDE可能会添加回车符\r和换行符\r,因此,为什么Intellij上33适用于您而不是我。@mewkie我说有行拆分器0x0d0a。你可以打印你的any,它不是33,而是0x33330d0a。这是一个很好的解释。如果您只想读取用户以前键入的数字,最好的办法是使用以字符串形式获取输入,然后使用将该字符串转换为整数;哦,很好,使用起来更好
('3' << 24) + ('3' << 16) + ('3' << 8) + '\n'