Java BufferedReader: Como ler um arquivo com exemplo
⚡ Resumo Inteligente
Java BufferO edReader lê texto de um fluxo de entrada armazenando caracteres em buffer, o que torna a leitura de arquivos linha por linha rápida e simples.ping um FileReader dentro BufferedReader e banheiroping Ao ler uma linha até que ela retorne nulo, o arquivo inteiro é impresso.

Como ler um arquivo em Java?
Java Oferece diversos mecanismos para ler de um arquivo. O pacote mais útil para isso é java.io, cujos abdominaistract Reader A classe define a leitura de fluxo de caracteres. java.io.BufferedReader é a subclasse concreta usada para leitura eficiente baseada em linhas.
O que é a BufferedReader em Java?
BufferedReader é um Java Classe que lê texto de um fluxo de entrada, como um arquivo, armazenando caracteres em buffer para que caracteres, arrays e linhas sejam lidos de forma eficiente. Sem o armazenamento em buffer, cada solicitação de leitura feita a um Reader aciona uma solicitação de leitura correspondente no fluxo de caracteres ou bytes subjacente.
Portanto, é aconselhável embrulhar BufferedReader em torno de qualquer Reader cujo read() As operações podem ser dispendiosas, tais como: FileReader e InputStreamReaderUm uso típico passa o caminho do arquivo para o leitor da seguinte forma:
// Note the doubled backslash: a single \ starts an escape sequence objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));
Isso carrega o arquivo em objReaderEm seguida, você percorre o conteúdo do arquivo e imprime cada linha. O loop while no código abaixo lê o arquivo até chegar ao final.
while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); }
strCurrentLine mantém a linha atual, e objReader.readLine() Retorna uma String. O loop, portanto, continua iterando enquanto o valor retornado não for nulo e para no primeiro valor nulo, que sinaliza o fim do arquivo.
BufferExemplo de edReader
O código abaixo é um completo Java BufferExemplo de edReader:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { BufferedReader objReader = null; try { String strCurrentLine; objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt")); while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (objReader != null) objReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
Observação: O finally A importância do bloco. Ele garante que objReader.close() A execução ocorre independentemente de uma exceção ter sido lançada ou não, liberando o identificador de arquivo subjacente e mantendo-o ativo. gerenciamento de memória previsível. A tentativa aninhada dentro finally é necessário porque close() declara IOException.
BufferExemplo de edReader JDK7
A partir do JDK 7, o try-with-resources remove o finally bloco inteiro. Qualquer recurso declarado entre parênteses do try A instrução é fechada automaticamente quando o bloco termina, na ordem inversa de sua criação, mesmo que uma exceção se propague:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample_jdk7 { private static final String FILENAME = "D:\\DukesDiary.txt"; public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) { String strCurrentLine; while ((strCurrentLine = br.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } } }
Esta versão é mais curta e segura, sendo, portanto, a forma preferencial em novos códigos. A leitura de um arquivo é apenas um dos usos da classe; a próxima seção a compara com a alternativa que a maioria dos iniciantes utiliza primeiro.
BufferedReader ou scanner: qual usar?
Ambas as classes leem texto, e os iniciantes costumam escolher uma delas arbitrariamente. Elas resolvem problemas diferentes, e a escolha errada se manifesta como uma análise manual desajeitada ou um baixo desempenho quando a entrada chega a milhares de linhas. A tabela abaixo as compara lado a lado.
| Aspecto | BufferedReader | Scanner |
|---|---|---|
| Returns | Linhas inteiras como string | Tokens e tipos primitivos analisados |
| Análise sintática integrada | Não — você se divide ou se converte. | Sim — nextInt, próximoDouble, próxima linha |
| Buffer padrão | 8192 caracteres | 1024 caracteres |
| Velocidade em arquivos grandes | Mais rápido | Mais lento, devido à tokenização por expressões regulares. |
| Segurança da rosca | Synccronizado | Não sincronizado |
| Melhor para | Lendo arquivos grandes linha por linha | Pequeno campo de entrada interativo que requer valores digitados. |
Escolha BufferedReader quando o objetivo é percorrer um arquivo rapidamente e manipular o texto manualmente, e Scanner quando você deseja valores digitados sem escrever código de conversão. Dividindo cada linha retornada com o Método de divisão de string dá BufferO edReader oferece a maior parte da praticidade do Scanner em alta velocidade.
Como ler a entrada do console usando BufferedReader
A mesma classe lê a entrada do teclado, o que é útil para pequenos programas de linha de comando e para entrada em desafios de programação. System.in é um fluxo de bytes, portanto não pode ser entregue a BufferedReader diretamente. Um InputStreamReader faz a ponte entre bytes e caracteres, e BufferO edReader adiciona então uma leitura de linha eficiente sobre essa ponte.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ReadConsoleExample { public static void main(String[] args) throws IOException { // Bridge the System.in byte stream to a character stream try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.print("Enter your name: "); String name = reader.readLine(); System.out.print("Enter your age: "); // readLine always returns text, so convert it explicitly int age = Integer.parseInt(reader.readLine().trim()); System.out.println("Hello " + name + ", age " + age); } } }
Três detalhes merecem ser lembrados. Primeiro, readLine() sempre retorna uma String, portanto, a entrada numérica deve ser convertida com Integer.parseInt ou similar, e uma entrada não numérica gera um erro. NumberFormatException — Envolva a conversão se a entrada não for confiável. Em segundo lugar, chame .trim() remove o retorno de carro final que Windows consoles append, uma causa frequente de falhas de análise. Terceiro, evite fechar um leitor que esteja envolvido em System.in Se o programa ainda precisar de entrada do console posteriormente, isso ocorre porque fechar o wrapper encerra permanentemente o fluxo subjacente para esse processo.
Para programas que leem muitos valores, ler uma linha e dividi-la é muito mais rápido do que chamar uma função. readLine() repetidamente, já que cada chamada só acessa o sistema operacional quando o buffer está vazio. Essa é a principal razão pela qual programadores competitivos preferem BufferedReader sobre Scanner para entrada em massa.
Mesmo com o código correto, alguns erros aparecem repetidamente.
comum BufferErros do edReader e como corrigi-los
Os mais BufferAs falhas do edReader decorrem de caminhos de arquivo, gerenciamento de recursos ou codificação de caracteres, e não do próprio loop de leitura. Cada erro abaixo indica sua exceção e sua solução.
- Personagem de fuga ilegal: O caminho usa uma única barra invertida, como em
"D:\DukesDiary.txt". Double a"D:\\DukesDiary.txt"ou use uma barra invertida, que Java aceita em Windows. - Exceção FileNotFoundException: O caminho é relativo ao diretório de trabalho, não ao arquivo de origem. Imprimir
new File(name).getAbsolutePath()para ver onde Java está realmente procurando. - NullPointerException na primeira leitura: O leitor nunca foi atribuído porque o construtor lançou uma exceção, e esta foi ignorada. Verifique o manipulação de exceção antes do loop.
- Caracteres ilegíveis ou em forma de ponto de interrogação: O arquivo é UTF-8, mas
FileReaderFoi aplicado o conjunto de caracteres padrão da plataforma. Você pode especificar um conjunto de caracteres explicitamente, por exemplo.new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8). - Transmissão encerrada: O leitor foi fechado dentro do loop ou reutilizado após o término do try-with-resources. Abra um novo leitor para cada iteração sobre o arquivo.
