Exemplo de RandomAccessFile em Java

Java RandomAccessFile fornece a facilidade de ler e escrever dados em um arquivo. RandomAccessFile trabalha com o arquivo como um grande array de bytes armazenado no sistema de arquivos e um cursor com o qual podemos mover a posição do ponteiro do arquivo.

Java RandomAccessFile

A classe RandomAccessFile faz parte do Java IO. Ao criar uma instância de RandomAccessFile em Java, precisamos fornecer o modo de abertura do arquivo. Por exemplo, para abrir o arquivo apenas para leitura, devemos usar “r” e para operações de leitura e gravação, devemos usar “rw”. Usando o ponteiro do arquivo, podemos ler ou escrever dados no arquivo de acesso aleatório em qualquer posição. Para obter o ponteiro do arquivo atual, você pode chamar o método getFilePointer() e para definir o índice do ponteiro do arquivo, você pode chamar o método seek(int i). Se escrevermos dados em qualquer índice onde os dados já estão presentes, isso os substituirá.

Exemplo de leitura em Java RandomAccessFile

Podemos ler uma matriz de bytes de um arquivo usando RandomAccessFile em Java. Abaixo está o pseudo código para ler arquivo usando RandomAccessFile.

RandomAccessFile raf = new RandomAccessFile("file.txt", "r");
raf.seek(1);
byte[] bytes = new byte[5];
raf.read(bytes);
raf.close();
System.out.println(new String(bytes));

Na primeira linha, estamos criando uma instância de RandomAccessFile para o arquivo em modo somente leitura. Em seguida, na segunda linha, estamos movendo o ponteiro do arquivo para o índice 1. Criamos uma matriz de bytes com comprimento 5, então quando chamamos o método read(bytes), 5 bytes são lidos do arquivo para a matriz de bytes. Finalmente, estamos fechando o recurso RandomAccessFile e imprimindo a matriz de bytes no console.

Exemplo de escrita em Java com RandomAccessFile

Aqui está um exemplo simples mostrando como escrever dados em um arquivo usando RandomAccessFile em Java.

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
raf.seek(5);
raf.write("Data".getBytes());
raf.close();

Como o RandomAccessFile trata o arquivo como uma matriz de bytes, a operação de escrita pode sobrescrever os dados, bem como pode acrescentar ao arquivo. Tudo depende da posição do ponteiro do arquivo. Se o ponteiro for movido além do comprimento do arquivo e então a operação de escrita for chamada, então haverá dados inválidos escritos no arquivo. Portanto, você deve tomar cuidado com isso ao usar a operação de escrita.

Exemplo de anexação com RandomAccessFile

Tudo o que precisamos é garantir que o ponteiro do arquivo esteja no final do arquivo para anexar a um arquivo. Abaixo está o código para anexar a um arquivo usando o RandomAccessFile.

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
raf.seek(raf.length());
raf.write("Data".getBytes());
raf.close();

Exemplo de RandomAccessFile em Java

Aqui está um exemplo completo de RandomAccessFile em Java com diferentes operações de leitura e gravação.

package com.journaldev.files;

import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileExample {

	public static void main(String[] args) {
		try {
			// conteúdo do arquivo é "ABCDEFGH"
			String filePath = "/Users/pankaj/Downloads/source.txt"; 
			
			System.out.println(new String(readCharsFromFile(filePath, 1, 5)));

			writeData(filePath, "Data", 5);
			// agora o conteúdo do arquivo é "ABCDEData"
			
			appendData(filePath, "pankaj");
			// agora o conteúdo do arquivo é "ABCDEDatapankaj"
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void appendData(String filePath, String data) throws IOException {
		RandomAccessFile raFile = new RandomAccessFile(filePath, "rw");
		raFile.seek(raFile.length());
		System.out.println("current pointer = "+raFile.getFilePointer());
		raFile.write(data.getBytes());
		raFile.close();
		
	}

	private static void writeData(String filePath, String data, int seek) throws IOException {
		RandomAccessFile file = new RandomAccessFile(filePath, "rw");
		file.seek(seek);
		file.write(data.getBytes());
		file.close();
	}

	private static byte[] readCharsFromFile(String filePath, int seek, int chars) throws IOException {
		RandomAccessFile file = new RandomAccessFile(filePath, "r");
		file.seek(seek);
		byte[] bytes = new byte[chars];
		file.read(bytes);
		file.close();
		return bytes;
	}

}

Isso é tudo para RandomAccessFile em Java.

Source:
https://www.digitalocean.com/community/tutorials/java-randomaccessfile-example