DEV Community

Arquivos de acesso aleatório

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)

Enter fullscreen mode Exit fullscreen mode
  • 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

Enter fullscreen mode Exit fullscreen mode
  • 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);
    }
  }
}

Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode

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.

Image description

Top comments (0)