为什么新的 InputStream 仍然会读取旧的 InputStream 剩下的内容?
Why a new InputStream will still read what is left over from an old InputStream?
好吧,请先查看 问题和 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 个),您很可能会看到行为上的差异.请注意,您可能不会 - 这将取决于围绕数据移动时间的许多不同因素。
基本上,教训应该是您不想在同一个流上构建多个读取器 - 由于缓冲,很难预测会发生什么。
好吧,请先查看
这次我有这个服务器:
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 个),您很可能会看到行为上的差异.请注意,您可能不会 - 这将取决于围绕数据移动时间的许多不同因素。
基本上,教训应该是您不想在同一个流上构建多个读取器 - 由于缓冲,很难预测会发生什么。