Buffers

Essencialmente, um buffer é uma entidade intermediária entre duas ou mais outras entidades que produzem e consomem elementos. Internamente, um buffer contém uma área de memória que é utilizada para armazenamento temporário de elementos que foram produzidos mas ainda não foram consumidos.

Esquema básico de buffering

Essa capacidade de um buffer manter temporariamente parte dos dados produzidos mas não consumidos torna-o um mecanismo adequado para compatibilizar a operação de entidades operando em diferentes velocidades. Além de oferecer transparentemente as mesmas funcionalidades de leitura e escrita de dados, um buffer normalmente oferece operações adicionais que permitem consultar se há dados disponíveis para leitura no buffer de entrada ou para solicitar que os dados presentes no buffer de saída sejam enviados imediatamente para o dispositivo de saída.

Em Java, há quatro classes que adicionam as funcionalidades de buffering às classes fundamentais de entrada e saída. Para classes que manipulam bytes, as classes BufferedInputStream e BufferedOutputStream são oferecidas. Para a manipulação de entrada e saída de texto, são oferecidas as classes BufferedReader e BufferedWriter, que adiciona um método void newLine() para lidar com separadores de linha de maneira independente de plataforma.