Java 数据输入流混淆

Java 数据输入流混淆,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");

为什么在运行这段代码时,如果将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");
}
因为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'