Visão geral
Neste tutorial, exploraremos diferentes maneiras de ler um arquivo em Java .
Primeiro, aprenderemos como carregar um arquivo do classpath, um URL ou de um arquivo JAR usando classes Java padrão.
Em segundo lugar, veremos como para ler o conteúdo com BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream e FileChannel. Também discutiremos como ler um arquivo codificado UTF-8.
Finalmente, exploraremos as novas técnicas de carregamento e leia um arquivo em Java 7 e Java 8.
Este artigo faz parte da série “Java – Back to Basic” no Baeldung.
Leitura adicional:
Java – Criar um arquivo
Java – Grave no arquivo
Configuração
2.1 Arquivo de entrada
Na maioria dos exemplos ao longo deste artigo, leremos um arquivo de texto com o nome de arquivo fileTest.txt que contém uma linha:
Para alguns exemplos, usaremos um arquivo diferente; nesses casos, mencionaremos o arquivo e seu conteúdo explicitamente.
2.2 Método auxiliar
Usaremos um conjunto de exemplos de teste com o núcleo Apenas classes Java, e nos testes, usaremos asserções com correspondências Hamcrest.
Os testes compartilharão um método readFromInputStream comum que transforma um InputStream em String para facilitar a declaração de resultados:
Observe que existem outras maneiras de obter esse mesmo resultado. Podemos consultar este artigo para algumas alternativas.
Lendo um arquivo do caminho de classe
3.1 . Usando Java padrão
Esta seção explica como ler um arquivo que está disponível em um caminho de classe. Leremos o “fileTest.txt” disponível em src / main / resources :
No trecho de código acima, usamos a classe atual para carregar um arquivo usando o método getResourceAsStream e passamos o caminho absoluto do arquivo a ser carregado.
O mesmo método está disponível em uma instância de ClassLoader também:
Obtemos o classLoa der da classe atual usando getClass (). getClassLoader ().
A principal diferença é que, ao usar getResourceAsStream em uma instância de ClassLoader, o caminho é tratado como absoluto a partir da raiz do caminho de classe.
Quando usado em uma instância de Classe, o caminho pode ser relativo ao pacote ou um caminho absoluto, que é sugerido pela barra inicial.
Claro, observe que na prática , os fluxos abertos devem sempre ser fechados, como o InputStream em nosso exemplo:
3.2. Usando a biblioteca commons-io
Outra opção comum é usar a classe FileUtils do pacote commons-io:
Aqui, passamos o objeto File para o método readFileToString () da classe FileUtils. Esta classe de utilitário consegue carregar o conteúdo sem a necessidade de escrever qualquer código clichê para criar uma instância de InputStream e ler dados.
A mesma biblioteca também oferece a classe IOUtils:
Aqui nós passe o objeto FileInputStream para o método toString () da classe IOUtils. Esta classe de utilitário atua da mesma maneira que a anterior para criar uma instância de InputStream e ler dados.
Lendo com BufferedReader
Agora vamos ” s se concentram em maneiras diferentes de analisar o conteúdo de um arquivo.
Começaremos com uma maneira simples de ler um arquivo usando BufferedReader:
Observe que readLine () retornará null quando o final do arquivo é alcançado.
Lendo de um arquivo usando Java NIO
No JDK7, o pacote NIO foi significativamente atualizado.
Vejamos um exemplo usando a classe Files e o método readAllLines. O método readAllLines aceita um Path.
A classe de caminho pode ser considerada uma atualização do java.io.File com algumas operações adicionais em vigor.
5.1. Lendo um pequeno arquivo
O código a seguir mostra como ler um pequeno arquivo usando a nova classe Files:
Observe que podemos usar o readAllBytes () método também se precisarmos de dados binários.
5.2. Lendo um arquivo grande
Se quisermos ler um arquivo grande com a classe Files, podemos usar o BufferedReader.
O código a seguir lê o arquivo usando a nova classe Files e BufferedReader:
5.3. Lendo um arquivo usando Files.lines ()
JDK8 oferece o método lines () dentro da classe Files. Ele retorna um fluxo de elementos String.
Vejamos um exemplo de como ler dados em bytes e decodificá-los usando o conjunto de caracteres UTF-8.
O código a seguir lê o arquivo usando o novo Files.lines ():
Usando o Stream com canais IO como operações de arquivo, precisamos fechar o stream explicitamente usando o método close ().
Como podemos ver, a API Files oferece outra maneira fácil de ler o conteúdo do arquivo em uma String.
Nas próximas seções, veremos outros métodos menos comuns de ler um arquivo que pode ser apropriado em algumas situações.
Lendo com o Scanner
A seguir, vamos usar um Scanner para ler o arquivo. Aqui, usaremos o espaço em branco como delimitador:
Observe que o delimitador padrão é o espaço em branco, mas vários delimitadores podem ser usados com um Scanner.
A classe Scanner é útil durante a leitura conteúdo do console, ou quando o conteúdo contém valores primitivos, com um delimitador conhecido (por exemplo: uma lista de inteiros separados por espaço).
Lendo com StreamTokenizer
Agora vamos ler um arquivo de texto em tokens usando um StreamTokenizer.
O tokenizer funciona primeiro descobrindo qual é o próximo token, String ou número. Fazemos isso observando o campo tokenizer.ttype.
Então leremos o token real com base neste tipo:
- tokenizer.nval – se o tipo for um número
- tokenizer.sval – se o tipo for uma String
Neste exemplo, usaremos um arquivo de entrada diferente que simplesmente contém:
O código a seguir lê do arquivo a String e o número:
Observe como o token de final de arquivo é usado no final.
Esta abordagem é útil para analisar um fluxo de entrada em tokens.
Lendo com DataInputStream
Podemos usar DataInputStream para ler binários ou tipos de dados primitivos de um arquivo.
O teste a seguir lê o arquivo usando um DataInputStream:
Lendo com FileChannel
Se nós estão lendo um arquivo grande, o FileChannel pode ser mais rápido que o IO padrão.
O código a seguir lê os bytes de dados do arquivo usando FileChannel e RandomAccessFile:
Lendo um codificador UTF-8 ed Arquivo
Agora vamos ver como ler um arquivo codificado em UTF-8 usando BufferedReader. Neste exemplo, leremos um arquivo que contém caracteres chineses:
Lendo conteúdo do URL
Para ler o conteúdo de um URL, usaremos “/” URL em nosso exemplo:
Existem também maneiras alternativas de se conectar a um URL. Aqui usamos a URL e a classe URLConnection disponíveis no SDK padrão.
Lendo um arquivo de um JAR
Para ler um arquivo que está localizado dentro de um Arquivo JAR, precisaremos de um JAR com um arquivo dentro dele. Para o nosso exemplo, leremos “LICENSE.txt” do arquivo “hamcrest-library-1.3.jar”:
Aqui, queremos carregar LICENSE.txt que reside na biblioteca Hamcrest, por isso usaremos a classe do Matcher que ajuda a obter um recurso. O mesmo arquivo pode ser carregado usando o carregador de classe também.
Conclusão
Como podemos ver, há muitas possibilidades para carregar um arquivo e ler dados dele usando Java puro.
Podemos carregar um arquivo de vários locais, como classpath, URL ou arquivos jar.
Então, nós pode usar BufferedReader para ler linha por linha, Scanner para ler usando diferentes delimitadores, StreamTokenizer para ler um arquivo em tokens, DataInputStream para ler dados binários e tipos de dados primitivos, SequenceInput Stream para vincular vários arquivos em um fluxo, FileChannel para ler mais rápido de grandes arquivos, etc.