O Java permite o acesso direto a qualquer posição de um arquivo com a classe RandomAccessFile, ideal para manipulação de dados que precisam ser lidos ou escritos fora de ordem. Ao contrário das classes InputStream e OutputStream, RandomAccessFile implementa as interfaces DataInput e DataOutput, que fornecem métodos para manipular tipos de dados primitivos (como int, double, etc.).
Estrutura e Construtor de RandomAccessFile
Construtor:
RandomAccessFile(String nomeArquivo, String acesso)
- nomeArquivo: nome do arquivo.
- acesso: define o tipo de acesso ("r" para leitura, "rw" para leitura e escrita).
- Método seek(long posicao): Define a posição do ponteiro dentro do arquivo.
void seek(long novaPos) throws IOException
- novaPos: Posição em bytes a partir do início do arquivo. Após seek, a leitura/escrita acontece a partir da nova posição.
Exemplo de Código: Acesso Aleatório a Valores Double
Abaixo, um exemplo que escreve seis valores do tipo double em um arquivo e depois os lê em posições específicas.
import java.io.*;
class RandomAccessDemo {
public static void main(String args[]) {
double data[] = { 19.4, 10.1, 123.54, 33.0, 87.9, 74.25 };
double d;
// Abre e usa um arquivo de acesso aleatório
try (RandomAccessFile raf = new RandomAccessFile("random.dat", "rw")) {
// Grava os valores no arquivo
for(int i = 0; i < data.length; i++) {
raf.writeDouble(data[i]);
}
// Lê valores específicos com o método seek()
raf.seek(0); // Busca o primeiro valor
d = raf.readDouble();
System.out.println("Primeiro valor: " + d);
raf.seek(8); // Busca o segundo valor
d = raf.readDouble();
System.out.println("Segundo valor: " + d);
raf.seek(8 * 3); // Busca o quarto valor
d = raf.readDouble();
System.out.println("Quarto valor: " + d);
System.out.println("\nValores alternados:");
for(int i = 0; i < data.length; i += 2) {
raf.seek(8 * i); // Busca o i-ésimo valor
d = raf.readDouble();
System.out.print(d + " ");
}
} catch(IOException exc) {
System.out.println("Erro de I/O: " + exc);
}
}
}
Explicação do Código:
Gravação: Os valores double são escritos no arquivo random.dat. Como cada double ocupa 8 bytes, cada valor começa em múltiplos de 8 bytes (0, 8, 16, ...).
Leitura com seek():
- Primeiro valor: Começa no byte 0.
- Segundo valor: Começa no byte 8.
- Quarto valor: Começa no byte 24 (3º índice, já que 8 * 3 = 24).
- Valores alternados: A cada 16 bytes (8 bytes entre cada valor), os valores são lidos.
Saída do Código
Exemplo de saída:
Primeiro valor: 19.4
Segundo valor: 10.1
Quarto valor: 33.0
Valores alternados:
19.4 123.54 87.9
Pontos Importantes:
Posicionamento com seek(): Define a posição do ponteiro para ler/escrever em qualquer parte do arquivo.
Controle de Posição com Bytes: Como cada double ocupa 8 bytes, podemos calcular a posição de cada valor usando múltiplos de 8.
Esse exemplo é útil para manipular grandes quantidades de dados de forma eficiente, acessando apenas os pontos necessários sem percorrer todo o arquivo.
Top comments (0)