Java - Ler do arquivo
1. Visão geral
Neste tutorial, exploraremos maneiras diferentes deread from a File in Java; usaremosBufferedReader,Scanner,StreamTokenizer,DataInputStream,SequenceInputStreameFileChannel.
Em seguida, discutiremos como ler um arquivo codificado em UTF-8 e como criar String a partir do conteúdo de um arquivo.
Por fim, exploraremos as novas técnicas para ler arquivos em Java 7.
Este artigo faz parte dethe “Java – Back to Basic” series aqui no exemplo.
2. Leia comBufferedReader
Vamos começar com uma maneira simples de ler o arquivo usandoBufferedReader; o próprio arquivo contém:
Hello world
O código a seguir é lido do arquivo usandoBufferedReader:
@Test
public void whenReadWithBufferedReader_thenCorrect()
throws IOException {
String expected_value = "Hello world";
String file ="src/test/resources/test_read.txt";
BufferedReader reader = new BufferedReader(new FileReader(file));
String currentLine = reader.readLine();
reader.close();
assertEquals(expected_value, currentLine);
}
Observe quereadLine() retornaránull quando o final do arquivo for alcançado.
3. Leia comScanner
A seguir, vamos usar umScanner para ler o arquivo - o arquivo contém:
Hello world 1
Usaremos um espaço em branco simples como delimitador:
@Test
public void whenReadWithScanner_thenCorrect()
throws IOException {
String file = "src/test/resources/test_read.txt";
Scanner scanner = new Scanner(new File(file));
scanner.useDelimiter(" ");
assertTrue(scanner.hasNext());
assertEquals("Hello", scanner.next());
assertEquals("world", scanner.next());
assertEquals(1, scanner.nextInt());
scanner.close();
}
Observe que o delimitador padrão é o espaço em branco, mas vários delimitadores podem ser usados comScanner.
4. Leia comStreamTokenizer
A seguir, vamos ler um arquivo de texto em tokens usando umStreamTokenizer.
A forma como o tokenizer funciona é - primeiro, precisamos descobrir qual é o próximo token - String ou número; fazemos isso olhando para o campotokenizer.ttype.
Em seguida, leremos o token real com base neste tipo:
-
tokenizer.nval - se o tipo for um número
-
tokenizer.sval - se o tipo for String
O arquivo simplesmente contém:
Hello 1
O código a seguir lê do arquivo a String e o número:
@Test
public void whenReadWithStreamTokenizer_thenCorrectTokens()
throws IOException {
String file = "src/test/resources/test_read.txt";
FileReader reader = new FileReader(file);
StreamTokenizer tokenizer = new StreamTokenizer(reader);
// token 1
tokenizer.nextToken();
assertEquals(StreamTokenizer.TT_WORD, tokenizer.ttype);
assertEquals("Hello", tokenizer.sval);
// token 2
tokenizer.nextToken();
assertEquals(StreamTokenizer.TT_NUMBER, tokenizer.ttype);
assertEquals(1, tokenizer.nval, 0.0000001);
// token 3
tokenizer.nextToken();
assertEquals(StreamTokenizer.TT_EOF, tokenizer.ttype);
reader.close();
}
Observe como o fim do token de arquivo é usado no final.
5. Leia comDataInputStream
Podemos usarDataInputStream para ler tipos de dados binários ou primitivos do arquivo.
Vamos começar com o próprio arquivo:
Hello
O teste a seguir lê o arquivo usando umDataInputStream:
@Test
public void whenReadWithDataInputStream_thenCorrect()
throws IOException {
String expectedValue = "Hello";
String file ="src/test/resources/test_read.txt";
DataInputStream reader = new DataInputStream(new FileInputStream(file));
String result = reader.readUTF();
reader.close();
assertEquals(expectedValue, result);
}
6. Leia comFileChannel
Se estivermos lendo um arquivo grande,FileChannel pode ser mais rápido que o IO padrão.
O conteúdo do arquivo:
Hello world
O código a seguir lê os bytes de dados do arquivo usandoFileChanneleRandomAccessFile:
@Test
public void whenReadWithFileChannel_thenCorrect()
throws IOException {
String expected_value = "Hello world";
String file = "src/test/resources/test_read.txt";
RandomAccessFile reader = new RandomAccessFile(file, "r");
FileChannel channel = reader.getChannel();
int bufferSize = 1024;
if (bufferSize > channel.size()) {
bufferSize = (int) channel.size();
}
ByteBuffer buff = ByteBuffer.allocate(bufferSize);
channel.read(buff);
buff.flip();
assertEquals(expected_value, new String(buff.array()));
channel.close();
reader.close();
}
7. Ler arquivo codificado em UTF-8
Agora, vamos ver como ler um arquivo codificado em UTF-8 usandoBufferedReader:
@Test
public void whenReadUTFEncodedFile_thenCorrect()
throws IOException {
String expected_value = "青空";
String file = "src/test/resources/test_read.txt";
BufferedReader reader = new BufferedReader
(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String currentLine = reader.readLine();
reader.close();
assertEquals(expected_value, currentLine);
}
8. Ler um arquivo em uma string
Podemos fazer bom uso deStringBuilder aread the entire contents of a file into a String. Vamos começar com o arquivo:
Hello world
Test line
O código a seguir acrescenta dados lidos do arquivo emStringBuilder linha por linha:
@Test
public void whenReadFileContentsIntoString_thenCorrect()
throws IOException {
String expected_value = "Hello world n Test line n";
String file = "src/test/resources/test_read.txt";
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuilder builder = new StringBuilder();
String currentLine = reader.readLine();
while (currentLine != null) {
builder.append(currentLine);
builder.append("n");
currentLine = reader.readLine();
}
reader.close();
assertEquals(expected_value, builder.toString());
}
9. Ler do arquivo usando Java 7
Java 7 apresenta uma nova maneira de trabalhar com arquivos e sistema de arquivos - vamos fazer uso disso para ler arquivos.
9.1. Leia um pequeno arquivo com Java 7
O conteúdo do arquivo:
Hello world
O código a seguir mostra como ler arquivos pequenos usando a nova classeFiles:
@Test
public void whenReadSmallFileJava7_thenCorrect()
throws IOException {
String expected_value = "Hello world";
Path path = Paths.get("src/test/resources/test_read.txt");
String read = Files.readAllLines(path).get(0);
assertEquals(expected_value, read);
}
Observe que você também pode usar o métodoreadAllBytes() se precisar de dados binários.
9.2. Leia um arquivo grande com Java 7
Se quisermos ler um arquivo grande com a classeFiles, podemos usarBufferedReader.
O conteúdo do arquivo:
Hello world
O código a seguir lê o arquivo usando a nova classeFiles eBufferedReader:
@Test
public void whenReadLargeFileJava7_thenCorrect()
throws IOException {
String expected_value = "Hello world";
Path path = Paths.get("src/test/resources/test_read.txt");
BufferedReader reader = Files.newBufferedReader(path);
String line = reader.readLine();
assertEquals(expected_value, line);
}
10. Conclusão
Como você pode ver, existem muitas possibilidades para ler dados de um arquivo usando Java simples. Você pode ir paraBufferedReader para ler linha por linha,Scanner para ler usando delimitadores diferentes,StreamTokenizer para ler um arquivo em tokens,DataInputStream para ler dados binários e dados primitivos tipos,SequenceInput Stream para vincular vários arquivos em um fluxo,FileChannel para ler arquivos grandes com mais rapidez, etc.