java网络i / o阻塞与否?

时间:2009-07-02 17:10:54

标签: networking io blocking

希望这是一个关于java中BufferedOutputStreams和DataOutputStreams的快速简单的问题。

当我将字节写入输出流时,如

myBufferedOutputStream.write(array);
myDataOutputStream.write(array);

这些方法是立即将它们写入流并返回还是阻止它们?

我没有在核心java文档中看到任何内容,但也许我的问题没有意义,因为写入永远不会阻止?

有人请我直截了当。

谢谢, JBU

4 个答案:

答案 0 :(得分:2)

彼得的答案是最好的,但是从错误信息开始就是无效的:不,它并不“依赖于实施”。缓冲的整个要点是软化阻塞的影响,但是当缓冲区已满且输出硬件未就绪时,write()会阻塞。但是由于它是缓冲的,因此与普通的OutputStream相比,它可以更少地阻塞,并且对吞吐量的影响要小得多。缓冲是一种快速简便的方法,可以大大提高性能。

答案 1 :(得分:1)

java.io.*中的所有读写方法都有可能阻止。无支持异步I / O.对于阅读,必须使用.available()或类似机制手动实现。对于写作,嗯,你是独立的。

答案 2 :(得分:1)

java.io. *包中的API可能会被阻止。但是,有一个特殊的API,称为Java NIO(新I / O或非阻塞I / O),您应该将其用于异步I / O.

查看包java.nio。* 您可以在此处找到一些示例:http://en.wikipedia.org/wiki/New_I/O

答案 3 :(得分:0)

我认为这取决于实施。如果您使用BufferedOutputStream之类的内容,则对write()的调用可能不会“阻止”,因为该类会为性能提供缓冲。

但是,如果使用FileOutputStream,写入调用可能会阻塞,具体取决于系统上I / O资源的繁忙/可用,因为对write()的调用实际上可能会触发I / O当时的操作,需要时间才能完成。