我的服务器/客户端对中有以下代码行:
BufferedOutputStream out = new BufferedOutputStream (clientSocket.getOutputStream());
它工作正常,代码运行良好,然后如果我将其修改为:
BufferedOutputStream out = new BufferedOutputStream (new BufferedOutputStream(clientSocket.getOutputStream()));
该应用程序的执行将在发送输出的地方停止。我实际上只是进行了修改,并且以这种方式对流非常陌生,尤其是套接字。
有明显的错误吗?
最佳答案
是的,这与BufferedOutputStream
的行为一致,顾名思义,它会在发送之前缓冲输出。
当您将对象写入ObjectOutputStream
时,字节将被传递到BufferedOutputStream
,后者仅在缓冲区缓冲区已满时才将它们发送到套接字。因此,您的对象将在缓冲区中“徘徊”,等待刷新。因此,您的输出并不是真正的“发送”,因为它们还没有达到套接字。
如果您想继续使用BufferedOutputStream
,则可能需要定期对其进行flush()
,以保持进展。 flush()
上的ObjectOutputStream
方法将依次调用flush()
上的BufferedOutputStream
,这将清空缓冲区并将对象沿管道发送。
不过,我不得不问,为什么您根本需要使用BufferedOuputStream
。您是否存在需要缓冲解决的性能问题?如果没有,那么就忽略它,它会增加您可能不需要的复杂性。