java - 为什么新的InputStream仍然会读取旧InputStream中剩下的内容?

标签 java io

好吧,请先查看 this 问题和 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];
        }

    }
}

当我从客户端发送字符“123456789”时,这就是我在服务器终端中看到的内容,但我不应该只看到 12345 吗?

为什么行为会有所不同?

最佳答案

您的客户端已设置为一次仅发送 5个字符,然后刷新 - 因此即使InputStreamReader可能询问对于更多的数据,它收到的数据更少,然后发现它可以满足你对 5 个字符的请求。

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

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

关于java - 为什么新的InputStream仍然会读取旧InputStream中剩下的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28419989/

相关文章:

java - 重新实现 org.apache.commons.net.io.Util 来解析 InputStream

io - 未实现 Seek 时如何从 std::io::Read 特性中推进数据?

linux - 有什么方法可以阻止后台输出在 Linux 终端中分解输入?

Java 相当于 C 中的 fscanf

java - 带有 ImageIcon 的 Eclipse 项目

java - 如何跳转到 Java 属性文件中的某个部分?

java - 运行显示输出/解析命令的 .jar 文件

python - 将大文件逐行读入 Python2.7 时的内存使用

java - 如何在不调整大小的情况下将组件添加到 JFrame 中?

java - Spring Boot 自定义运行状况指示器未显示