Ler um arquivo em um ArrayList
1. Visão geral
Neste tutorial, discutiremosdifferent ways of reading a file into an ArrayList.
Existem várias maneiras deread a file in Java. Depois de ler um arquivo, podemos realizar muitas operações no conteúdo desse arquivo.
Algumas dessas operações, como a classificação, podem exigir o processamento de todo o conteúdo do arquivo na memória. Para executar tais operações, podemos precisar ler o arquivo comoArray ouList de linhas ou palavras.
2. UsandoFileReader
A maneira mais básica de ler um arquivo em Java é usandoFileReader. Por definição,FileReader is a convenience class for reading stream of characters from a File.
Existem vários construtores disponíveis para inicializar umFileReader:
FileReader f = new FileReader(String filepath);
FileReader f = new FileReader(File f);
FileReader f = new FileReader(FileDescriptor fd);
Todos esses construtores assumem que a codificação de caracteres padrão e o tamanho padrão do buffer de bytes são adequados.
No entanto, se quisermos fornecer codificação de caracteres personalizada e tamanho do buffer de bytes, podemos usarInputStreamReader ouFileInputStream.
No código a seguir, demonstraremos como ler as linhas de um arquivo em umArrayList, usandoFileReader:
ArrayList result = new ArrayList<>();
try (FileReader f = new FileReader(filename)) {
StringBuffer sb = new StringBuffer();
while (f.ready()) {
char c = (char) f.read();
if (c == '\n') {
result.add(sb.toString());
sb = new StringBuffer();
} else {
sb.append(c);
}
}
if (sb.length() > 0) {
result.add(sb.toString());
}
}
return result;
3. UsandoBufferedReader
EmboraFileReader seja muito fácil de usar, é aconselhável sempre envolvê-lo comBuffereReader, ao ler um arquivo.
Isso ocorre porqueBufferedReader uses a char buffer to simultaneously read multiple values from a character-input stream areia, portanto, reduz o número de chamadasread() feitas peloFileStream subjacente.
Os construtores paraBufferedReader usamReader como entrada. Além disso, também podemos fornecer tamanho de buffer nos construtores, mas, na maioria dos casos de uso, o tamanho padrão é grande o suficiente:
BufferedReader br = new BufferedReader(new FileReader(filename));
BufferedReader br = new BufferedReader(new FileReader(filename), size);
Além dos métodos herdados da classeReader, métodoBufferedReader also providesreadLine(), para ler uma linha inteira como umString:
ArrayList result = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
while (br.ready()) {
result.add(br.readLine());
}
}
4. UsandoScanner
Outra forma comum de ler arquivos é por meio deScanner.
Scanner é um scanner de texto simples, usado para analisar tipos primitivos e strings, usando expressões regulares.
Ao ler arquivos,Scanner é inicializado usando objetosFile ouFileReader:
Scanner s = new Scanner(new File(filename));
Scanner s = new Scanner(new FileReader(filename));
Semelhante aBufferedReader, Scanner fornece o métodoreadLine() para ler uma linha inteira. Além disso,, it também fornece um métodohasNext() para indicar se mais valores estão disponíveis para leitura ou não :
ArrayList result = new ArrayList<>();
try (Scanner s = new Scanner(new FileReader(filename))) {
while (s.hasNext()) {
result.add(s.nextLine());
}
return result;
}
Scanner divide sua entrada em tokens usando um delimitador, sendo o delimitador padrão um espaço em branco. Esses tokens podem ser convertidos em valores de diferentes tipos, usando vários métodosnext (nextInt,nextLong, etc) disponíveis:
ArrayList result = new ArrayList<>();
try (Scanner s = new Scanner(new FileReader(filename))) {
while (s.hasNext()) {
result.add(s.nextInt());
}
return result;
}
5. UsandoFiles.readAllLines
Provavelmente a maneira mais fácil de ler um arquivo e analisar todas as suas linhas em umArrayList, é usar oreadAllLines() method available in Files class:
List result = Files.readAllLines(Paths.get(filename));
Este método também pode usar um parâmetro charset, para ler de acordo com uma codificação de caracteres específica:
Charset charset = Charset.forName("ISO-8859-1");
List result = Files.readAllLines(Paths.get(filename), charset);
6. Conclusão
Para resumir, discutimos algumas maneiras comuns de ler o conteúdo de umFile em umArrayList. Além disso, abordamos algumas vantagens e desvantagens dos vários métodos.
Por exemplo, podemos usarBufferedReader para buffer de caracteres para eficiência. Alternativamente, poderíamos usarScanner para ler primitivos usando delimitadores. Ou talvez pudéssemos simplesmente usarFiles.readAllLines(), sem nos preocupar com a implementação subjacente.
Como de costume, o código está disponível em nossoGitHub repository.