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.
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.