Java 为什么新的InputStream仍将读取旧InputStream的剩余内容?
请先看问题和Jon Skeet的答案 这次我有了这个服务器: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
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在下一个数据包中发送,所以它们没有被读取(正如发生的那样)由第一个读者,并仍然在流中。非常感谢,明白了。