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

use*_*776 5 java buffer flush 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循环逐字节写入

请有人澄清实际发生了什么,以及它如何更快?

gpe*_*che 1

从您的链接:

   /** Flush the internal buffer */
   private void flushBuffer() throws IOException {
       if (count > 0) {
           out.write(buf, 0, count);
           count = 0;
       }
   }
Run Code Online (Sandbox Code Playgroud)

...

   /**
    * Flushes this buffered output stream. This forces any buffered
    * output bytes to be written out to the underlying output stream.
    *
    * @exception  IOException  if an I/O error occurs.
    * @see        java.io.FilterOutputStream#out
    */
   public synchronized void flush() throws IOException {
       flushBuffer();
       out.flush();
   }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它将flush()所有缓冲区内容一次性写入底层流,然后级联刷新。BufferedOutputStream然后重新实现write(byte b[], int off, int len)and void write(int b)(类中的核心方法,每次写入都委托给该类),以便它写入缓冲区,并在必要时刷新。