Java 为什么新的InputStream仍将读取旧InputStream的剩余内容?

Java 为什么新的InputStream仍将读取旧InputStream的剩余内容?,java,io,Java,Io,请先看问题和Jon Skeet的答案 这次我有了这个服务器: public class SimpleServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("Server Socket created, waiting for clien

请先看问题和Jon Skeet的答案

这次我有了这个服务器:

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());

        char[] chars = new char[5];

        System.out.println("Client connected, waiting for input");

        while (true) {
            inputStreamReader.read(chars,0,chars.length);
            for (int i=0;i<5;i++) {
                if(chars[i]!='\u0000') {
                    System.out.print(chars[i]);
                }
            }
            inputStreamReader = new InputStreamReader(accept.getInputStream());
            chars = new char[5];
        }

    }
}
公共类SimpleServer{
公共静态void main(字符串[]args)引发异常{
ServerSocket ServerSocket=新的ServerSocket(8888);
System.out.println(“已创建服务器套接字,正在等待客户端…”);
Socket accept=serverSocket.accept();
InputStreamReader InputStreamReader=新的InputStreamReader(accept.getInputStream());
char[]chars=新字符[5];
System.out.println(“客户端已连接,等待输入”);
while(true){
inputStreamReader.read(字符,0,字符长度);

对于(int i=0;i您的客户机已设置为一次只发送5个字符,然后刷新-因此,即使
InputStreamReader
可能要求更多的数据,但它收到的数据较少,然后发现它可以用所获得的数据满足您对5个字符的请求

尝试将服务器上的代码更改为一次只读取3个字符,而不是5个字符(但让客户端发送5个字符),您可能会看到行为上的差异。请注意,您可能不会看到,这将取决于数据移动的时间安排


基本上,教训应该是,您不希望在同一个流上构建多个读卡器-由于缓冲,很难预测会发生什么。

感谢您的回答,这次我将看到:“123678”在服务器的输出中,终端4和5丢失了,但它仍然可以读取678。这让我很困惑。@KorayTugay:这是因为4和5在从客户端发送到服务器的第一个“数据包”中,并且被读取到第一个
输入流的缓冲区中。6789在下一个数据包中发送,所以它们没有被读取(正如发生的那样)由第一个读者,并仍然在流中。非常感谢,明白了。