Java 使用缓冲流发送对象?

Java 使用缓冲流发送对象?,java,sockets,iostream,bufferedreader,Java,Sockets,Iostream,Bufferedreader,我目前正在一个客户端服务器应用程序中使用Java套接字,该应用程序具有OutputStream而不是BufferedOutputStream(输入流也是如此) 客户端和服务器交换序列化对象(writeObject()方法) 在这种情况下,使用BufferedOutputStream和BufferedInputStream(更快)有意义吗 当我必须刷新或不应该编写flush()语句时?我认为这些链接可能会帮助您: flush方法刷新输出流并强制写出任何缓冲的输出字节。flush的一般约定是,调用

我目前正在一个客户端服务器应用程序中使用Java套接字,该应用程序具有OutputStream而不是BufferedOutputStream(输入流也是如此)

客户端和服务器交换序列化对象(writeObject()方法)

在这种情况下,使用BufferedOutputStream和BufferedInputStream(更快)有意义吗


当我必须刷新或不应该编写flush()语句时?

我认为这些链接可能会帮助您:

flush方法刷新输出流并强制写出任何缓冲的输出字节。flush的一般约定是,调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地

在内部使用缓冲区数组,并读取足够的字节来填充缓冲区,而不是从底层输入流中单独读取字节。这通常会导致更快的性能,因为底层输入流需要更少的读取

作为讨论的开始,这里有一些关于如何加速I/O的基本规则:1.避免访问磁盘。2.避免访问底层操作系统。3.避免方法调用。4.避免单独处理字节和字符

因此,使用缓冲流通常会加快IO进程,因为在后台执行的read()更少

在这种情况下,使用BufferedOutputStream和BufferedInputStream(更快)有意义吗

实际上,它可能没有意义

对象流实现在内部用一个名为缓冲的私有类包装它所提供的流。如果您自己包装流,您将有两个级别的缓冲。。。这可能会导致性能下降2

当我必须刷新或不应该编写flush()语句时

是的,可能需要冲洗。但对于何时做这件事并没有普遍的答案

  • 一方面,如果刷新太频繁,会产生额外的网络流量

  • 另一方面,如果在需要时不刷新,服务器可能会暂停等待客户端已写入但未刷新的对象

你需要找到这两种综合征之间的折衷。。。这取决于应用程序的客户机/服务器交互模式;e、 g.消息模式是同步(如消息/响应)还是异步(如消息流)


1-为了确定这一点,您需要进行一些法医测试,1)测量系统性能,2)确定进行了哪些系统调用以及何时发送网络数据包。对于一般的答案,您需要在许多用例中重复这一点。我还建议您亲自查看Java库代码,以确认我的(简要)阅读

2-可能只是稍微差一点,但是一个设计良好的基准测试会发现一点性能差异


更新


在写了上面的内容之后,我发现了这个Q&A——这似乎表明使用
BufferedInputStream
/
BufferedOutputStream
有帮助。但是,我不确定所报告的性能改进是否是1)真实的(即不是热身伪品)和2)由于缓冲。这可能是由于添加了
flush()
调用。(原因:因为刷新可能会导致网络堆栈更快地推送数据。)

谢谢。我正在使用synchronouse消息模式。在这种情况下,哪个刷新原则是好的?如果我使用ObjectOutputStream ObjectOutputStream=new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream());对于输入流也是一样,我是否也必须在最后关闭BufferedOutputStream,或者这是通过关闭ObjectOutputStream和套接字自动完成的?最后但并非最不重要的是,我必须在ObjectOutputStream或BufferedOutputStream上调用flush()吗?1)我不能告诉你。您(即您)需要了解您的应用程序,以确定何时刷新。2) 如果关闭包装流,则包装流将关闭。3) 在包装器上调用
flush()
,它会传播到包装流。注意:通过阅读javadocs和源代码,您可以自己回答所有这三个问题。你需要学会这样做。你不能总是依赖别人愿意向你提供信息。