如何清除/重置/打开输入流,以便它可以在 Java 中的 2 种不同方法中使用?

Pet*_* K. 2 java iostream inputstream system.in bufferedreader

这是代码:

    package testpack;
    import java.io.*;

    public class InputStreamReadDemo {


        private void readByte() throws IOException {
            System.out.print("Enter the byte of data that you want to be read: ");        
            int a = System.in.read();
            System.out.println("The first byte of data that you inputted corresponds to the binary value "+Integer.toBinaryString(a)+" and to the integer value "+a+".");
            // tried writing System.in.close(); and System.in.reset();
        }
        private void readLine() throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Enter a line of text: ");
            String res = br.readLine();
            System.out.println("You entered the following line of text: "+res);
            // ... and tried writing br.close();
            // but that messes things up since the input stream gets closed and reset..
        }

        public static void main(String[] args) throws IOException {
            InputStreamReadDemo isrd = new InputStreamReadDemo();
            isrd.readByte();                                                // method 1
            isrd.readLine();                                                // method 2
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我运行此命令时的输出(当调用第一个方法时我输入“Something”,第二个方法然后出于某种原因自动读取“something”而不是让我再次输入......):

run:
Enter the byte of data that you want to be read: Something
The first byte of data that you inputted corresponds to the binary value 1010011 and to the integer value 83.
Enter a line of text: You entered the following line of text: omething
BUILD SUCCESSFUL (total time: 9 seconds)
Run Code Online (Sandbox Code Playgroud)

Mjo*_*r74 5

它打印出“something”的原因是,在调用 readByte 时,您只消耗输入的第一个字节。然后 readLine 消耗流中剩余的字节。

在 readByte 方法末尾尝试这一行:System.in.skip(System.in.available());

这将跳过流中的剩余字节(“某些内容”),同时仍然保持流打开以消耗 readLine 的下一个输入。

关闭 System.in 或 System.out 通常不是一个好主意。

import java.io.*;

public class InputStreamReadDemo {


    private void readByte() throws IOException {
        System.out.print("Enter the byte of data that you want to be read: ");        
        int a = System.in.read();
        System.out.println("The first byte of data that you inputted corresponds to the binary value "+Integer.toBinaryString(a)+" and to the integer value "+a+".");
        System.in.skip(System.in.available());
    }
    private void readLine() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter a line of text: ");
        String res = br.readLine();
        System.out.println("You entered the following line of text: "+res);
        // ... and tried writing br.close();
        // but that messes things up since the input stream gets closed and reset..
    }

    public static void main(String[] args) throws IOException {
        InputStreamReadDemo isrd = new InputStreamReadDemo();
        isrd.readByte();                                                // method 1
        isrd.readLine();                                                // method 2
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

$ java InputStreamReadDemo
Enter the byte of data that you want to be read: Something
The first byte of data that you inputted corresponds to the binary value 1010011 and to the integer value 83.
Enter a line of text: Another thing
You entered the following line of text: Another thing
Run Code Online (Sandbox Code Playgroud)

更新:正如我们在聊天中讨论的那样,它可以在命令行中运行,但不能在 netbeans 中运行。一定是IDE的东西。