Java fornece a classe RandomAccessFile para permitir que os dados sejam lidos e gravados em qualquer local do arquivo. Todos os streams que você usou até agora são conhecidos como streams somente leitura ou somente gravação. Esses fluxos são chamados de fluxos sequenciais. Um arquivo que é aberto usando um fluxo sequencial é chamado de arquivo de acesso sequencial. O conteúdo de um arquivo de acesso sequencial não pode ser atualizado. No entanto, muitas vezes é necessário modificar arquivos. Java fornece a classe RandomAccessFile para permitir que dados sejam lidos e gravados em qualquer local de um arquivo. Um arquivo que é aberto usando a classe RandomAccessFile é conhecido como arquivo de acesso aleatório.
A classe RandomAccessFile implementa as interfaces DataInput e DataOutput, conforme mostrado na figura abaixo. A interface DataInput define os métodos para leitura de valores e strings de tipo primitivo (por exemplo, readInt, readDouble, readChar, readBoolean, readUTF) e a interface DataOutput definem os métodos para escrever valores e strings de tipo primitivo (por exemplo, writeInt, writeDouble, writeChar, writeBoolean, writeUTF).
Ao criar um RandomAccessFile, você pode especificar um de dois modos: r ou rw. Modo r significa que o fluxo é somente leitura e modo rw indica que o fluxo permite leitura e gravação. Por exemplo, a instrução a seguir cria um novo fluxo, raf, que permite ao programa ler e gravar no arquivo test.dat:
RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");
Se test.dat já existir, raf será criado para acessá-lo; se test.dat não existir, um novo arquivo chamado test.dat será criado e raf será criado para acessar o novo arquivo. O método raf.length() retorna o número de bytes em test.dat em um determinado momento. Se você anexar novos dados ao arquivo, raf.length() aumenta.
Se o arquivo não for modificado, abra-o no modo r. Isso evita modificações não intencionais do arquivo.
Um arquivo de acesso aleatório consiste em uma sequência de bytes. Um marcador especial chamado ponteiro de arquivo é posicionado em um desses bytes. Uma operação de leitura ou gravação ocorre no local do ponteiro do arquivo. Quando um arquivo é aberto, o ponteiro do arquivo é colocado no início do arquivo. Quando você lê ou grava dados no arquivo, o ponteiro do arquivo avança para o próximo item de dados. Por exemplo, se você ler um valor int usando readInt(), a JVM lê 4 bytes do ponteiro do arquivo e agora o ponteiro do arquivo é 4 bytes à frente do local anterior, conforme mostrado na figura abaixo.
Para um RandomAccessFile raf, você pode usar o método raf.seek(position) para mover o ponteiro do arquivo para uma posição especificada. raf.seek(0) move-o para o início do arquivo e raf.seek(raf.length()) move-o para o final do arquivo. O código abaixo demonstra RandomAccessFile.
package demo; import java.io.*; public class TestRandomAccessFile { public static void main(String[] args) throws IOException { try( // Create a random access file RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw"); ) { // Clear the file to destroy the old contents if exists inout.setLength(0); // Write new integers to the file for(int i = 0; iO comprimento atual do arquivo é 800
O primeiro número é 0
O segundo número é 1
O décimo número é 9
O novo comprimento é 804
O décimo primeiro número é 555Um RandomAccessFile é criado para o arquivo chamado inout.dat com modo rw para permitir operações de leitura e gravação na linha 8.
inout.setLength(0) define o comprimento para 0 na linha 11. Isso, na verdade, destrói o conteúdo antigo do arquivo.
O loop for grava 200 valores int de 0 a 199 no arquivo nas linhas 14 e 15. Desde cada [ O valor &&&]int leva 4 bytes, o comprimento total do arquivo retornado de inout.length() agora é 800 (linha 18), conforme mostrado no exemplo de saída.
Invocarinout.seek(0) na linha 21 define o ponteiro do arquivo para o início do arquivo. inout.readInt() lê o primeiro valor na linha 22 e move o ponteiro do arquivo para o próximo número. O segundo número é lido na linha 26.
inout.seek(9 * 4) (linha 29) move o ponteiro do arquivo para o décimo número. inout.readInt() lê o décimo número e move o ponteiro do arquivo para o décimo primeiro número na linha 30. inout.write(555) grava um novo décimo primeiro número na posição atual ( linha 33). O décimo primeiro número anterior é destruído.
inout.seek(inout.length()) move o ponteiro do arquivo para o final do arquivo (linha 36). inout.writeInt(999) grava um 999 no arquivo (linha 37). Agora o comprimento do arquivo é aumentado em 4, então inout.length() retorna 804 (linha 40).
inout.seek(10 * 4) move o ponteiro do arquivo para o décimo primeiro número na linha 43. O novo décimo primeiro número, 555, é exibido na linha 44.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3