简体   繁体   English

为什么新的InputStreamReader无法读取控制台中的其余字符?

[英]Why a new InputStreamReader won't read the remaining characters in the console?

So I have a very simple server written in Java: 所以我有一个用Java编写的非常简单的服务器:

public class SimpleServer {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server Socket created, waiting for client...");
        Socket accept = serverSocket.accept();
        InputStreamReader inputStreamReader = new InputStreamReader(accept.getInputStream());
        int read;
        System.out.println("Client connected, waiting for input");
        while ((read = inputStreamReader.read()) != -1) {
            System.out.print((char) read);
        }
    }
}

And here is a code that I use to connect to it: 这是我用来连接它的代码:

public class SimpleClient {

    public static void main(String[] args) throws Exception {

        Socket socket = new Socket("localhost",8888);
        OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream());

        InputStreamReader inputStreamReader;
        char[] chars = new char[5];

        while (true) {
            System.out.println("Say something: ");
            inputStreamReader = new InputStreamReader(System.in);
            inputStreamReader.read(chars);
            int x = 0;
            for (int i=0;i<5;i++) {
                if(chars[i]!='\u0000') {
                    x++;
                }
            }
            outputStream.write(chars,0,x);
            outputStream.flush();
            chars = new char[5];
        }

    }

}

Now when I type something like this in the terminal of the Client: 现在,当我在客户端的终端中键入以下内容时:

123456789

I will see in the terminal of the Server: 我将在服务器的终端中看到:

Server Socket created, waiting for client...
Client connected, waiting for input
12345

However, when I change client as follows: 但是,当我如下更改客户端时:

public class SimpleClient {

    public static void main(String[] args) throws Exception {

        Socket socket = new Socket("localhost",8888);
        OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream());

        InputStreamReader inputStreamReader = new InputStreamReader(System.in);
        char[] chars = new char[5];

        while (true) {
            System.out.println("Say something: ");
            inputStreamReader.read(chars);
            int x = 0;
            for (int i=0;i<5;i++) {
                if(chars[i]!='\u0000') {
                    x++;
                }
            }
            outputStream.write(chars,0,x);
            outputStream.flush();
            chars = new char[5];
        }

    }

}

then for the same input, I will see: 然后对于相同的输入,我将看到:

Server Socket created, waiting for client...
Client connected, waiting for input
123456789

My question is, System.out is a static variable which is already open and connected to the terminal in this case. 我的问题是, System.out是一个静态变量,在这种情况下,该变量已经打开并已连接到终端。 Why is the information in the terminal lost when a new InputStreamReader object is created? 创建新的InputStreamReader对象时,为什么终端中的信息会丢失? Same terminal is passed to the object, isn't it? 相同的终端传递给对象,不是吗?

Why is the information in the terminal lost when a new InputStreamReader object is created? 创建新的InputStreamReader对象时,为什么终端中的信息会丢失?

When you call read() on the InputStreamReader , it's allowed to (and often will) read more data from the stream than you've actually requested, and store the rest in a buffer, to satisfy later read calls. 当您在InputStreamReader上调用read()时,它可以(而且经常会)从流中读取比您实际请求更多的数据,并将其余数据存储在缓冲区中,以满足以后的read调用。 I suspect the whole of the line of text has actually been read by the first InputStreamReader , so when you construct a second InputStreamReader for the same stream, there's nothing left for it to read, and you'd have to type in more text to get it to do anything. 我怀疑整个文本行实际上已被第一个InputStreamReader读取,因此当您为同一流构造第二个 InputStreamReader ,就没有读取的余地,并且您必须键入更多文本才能获取它无所不能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM