好吧,请先查看 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/