How does buffered I/O reduce the overhead which would occur if unbuffered I/O was used?
<p>From <a href="https://docs.oracle.com/javase/tutorial/essential/io/buffers.html" rel="nofollow">this tutorial</a>, </p>

<blockquote>
  <p>Most of the examples we've seen so far use <em>unbuffered</em> I/O. This means
  each read or write request is handled directly by the underlying OS.
  This can make a program much less efficient, since each such request
  often <em>triggers disk access, network activity, or some other operation
  that is relatively expensive</em>.</p>
  
  <p>To reduce this kind of overhead, the Java platform implements buffered
  I/O streams. Buffered input streams read data from a memory area known
  as a <em>buffer</em>; the <strong>native input API is called only when the buffer is
  empty.</strong> Similarly, buffered output streams write data to a buffer, and
  the <strong>native output API is called only when the buffer is full.</strong></p>
</blockquote>

<p>I understand that operations like disk-access, network activity etc. would cause memory or execution-time overhead for the underlying OS.</p>

<p><strong>But the question is</strong> that how does the program reading-from/writing-to a certain memory area (the buffer) reduce this overhead? </p>

<p>I see this as an addition of a couple extra steps: First the program requests the OS to, e.g., read data from a file and write it to the buffer, and then the program reads it from the buffer. </p>