user42541: As serial data bytes are being read from the serial buffer by Serial.read(), are they removed from the Arduino's 64-byte serial buffer altogether?
In my current situation I'm using SoftwareSerial, but this question applies to both software and hardware serial connections.
EDIT: Based on a comment from @dandavis, I'd like to further clarify my question
How does Serial.read() interact with Serial.available()? Let's say that I have the usual setup:
while( Serial.available() ) { 
    Serial.read();
} 

What causes Serial.available() to become false?
EDIT 2: Changed question title for even further clarification...

user38447: It is an internal buffer and only the pointer gets increased. It it visible in the source code off the project, located on github:
// Read data from buffer
int SoftwareSerial::read()
{
  if (!isListening())
    return -1;

  // Empty buffer?
  if (_receive_buffer_head == _receive_buffer_tail)
    return -1;

  // Read from "head"
  uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte
  _receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF;
  return d;
}

This third line from the bottom is the important part, it wraps back to the beginning if the buffer space has run out. If you call Serial.read(), the pointer is moved to the next position. So with the next Serial.read(), you'll get the next byte, if available. The byte itself gets overwritten only after the wrap (circular buffer).

42541: <p>As serial data bytes are being read from the serial buffer by <code>Serial.read()</code>, are they removed from the Arduino's 64-byte serial buffer altogether?</p>

<p>In my current situation I'm using SoftwareSerial, but this question applies to both software and hardware serial connections.</p>

<p><sub><strong>EDIT:</strong> <em>Based on a comment from <strong>@dandavis</strong>, I'd like to further clarify my question</em></sub></p>

<p>How does <code>Serial.read()</code> interact with <code>Serial.available()</code>? Let's say that I have the usual setup:</p>

<pre><code>while( Serial.available() ) { 
    Serial.read();
} 
</code></pre>

<p>What causes <code>Serial.available()</code> to become <code>false</code>?</p>

<p><sub><strong>EDIT 2:</strong> <em>Changed question title for even further clarification...</em></sub></p>
 38447: <p>It is an internal buffer and only the pointer gets increased. It it visible in the source code off the project, located on <a href="https://github.com/arduino/Arduino/blob/2bfe164b9a5835e8cb6e194b928538a9093be333/hardware/arduino/avr/libraries/SoftwareSerial/src/SoftwareSerial.cpp" rel="nofollow noreferrer">github</a>:</p>

<pre class="lang-c prettyprint-override"><code>// Read data from buffer
int SoftwareSerial::read()
{
  if (!isListening())
    return -1;

  // Empty buffer?
  if (_receive_buffer_head == _receive_buffer_tail)
    return -1;

  // Read from "head"
  uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte
  _receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF;
  return d;
}
</code></pre>

<p>This third line from the bottom is the important part, it wraps back to the beginning if the buffer space has run out. If you call <code>Serial.read()</code>, the pointer is moved to the next position. So with the next <code>Serial.read()</code>, you'll get the next byte, if available. The byte itself gets overwritten only after the wrap (circular buffer).</p>
