Tag: bufferedoutputstream

BufferedOutputStream如何实际工作在较低水平?

我理解BufferedOutputStream背后的理论。 字节被写入缓冲区数组直到它已满,然后写入(刷新)到底层流 – 这个想法是它比逐字节写入更快,因为OS调用更少。 但是,从查看BufferedOutputStream类和方法( BufferedOutputStream.java )的实现,似乎最终,缓冲区中的字节只是逐字节写入。 我认为情况是这样的: 在BufferedOutputStream.write(byte b [],int off,int len)中,它有行out.write(b,off,len)。 由于out是OutputStream的实例,而不是BufferedOutputStream,因此它调用OutputStream.write(byte [],int,int)。 这又使用for循环逐字节写入 请有人澄清实际发生的事情,以及它如何更快?

套接字:BufferedOutputStream还是只是OutputStream?

为了在Java中获得最快的TCP传输速度,这是更好的: 选项A: InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); 选项B: BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 我已经读过,当将8 KiB写入OutputStream时,性能会受到影响,建议它一次性写入小块,而不是写入8 KiB。 8 KiB是BufferedOutputStream的默认缓冲区大小。 但是我还读到,当通过网络传输数据时,尽可能快地清除字节是很好的。 这意味着使用缓冲区并以小块写入会增加不必要的开销。 那么,选项A还是选项B? 哪个效果最好? 现在我猜测选项A提供了最高的传输速度,同时消耗了比选项B更多的CPU。选项B可能更好,因为它没有那么慢,但节省了大量的CPU。 – 奖金问题:触摸TCP窗口大小是个好主意吗? 例如,将其设置为64 KiB: socket.setReceiveBufferSize(65536); socket.setSendBufferSize(65536); 我尝试在测试机器上将其设置为128 KiB,因为我读到它可以提高速度但是当服务器有几个连接时,CPU是100%而不是2%,就像我单独离开时一样。 我猜128 KiB太高了,除非你有一台能够处理流量急流的好服务器,但将它设置为32 KiB是否明智? 我认为我的默认值是8 KiB。 (“socket”是“java.net.Socket”)