RandomAccessFile
RandomAccessFile é usado para acessar arquivos que salvam registros de dados. Você pode usar o método Seek () para acessar registros e ler e escrever. O tamanho desses registros não precisa ser o mesmo; No entanto, seu tamanho e posição devem ser conhecidos. No entanto, esta classe é limitada a arquivos operacionais.
RandomAccessFile não pertence às classes InputStream e OutputStream. De fato, além de implementar as interfaces DataAinput e DataOutput (DataAinputStream e DataOutputStream também implementam essas duas interfaces), ele não tem nada a ver com essas duas classes e nem sequer usa funções que já existem nas classes InputStream e OutputStream; É uma classe completamente independente, e todos os métodos (principalmente pertencem a si mesmos) são escritos do zero. Isso pode ocorrer porque o RandomAccessFile pode se mover para frente e para trás no arquivo, portanto, seu comportamento é um pouco fundamentalmente diferente de outras classes de E/S. Em resumo, é uma classe separada que herda diretamente o objeto.
Basicamente, o método de trabalho do RandomAccessFile é combinar o DataAinputStream e o DataOutputStream e adicionar alguns de seus próprios métodos, como getFilePointer () para posicionamento, procedimento () para mover no arquivo e determinar o comprimento () para o tamanho do arquivo, e skipbytes () para pular por quantos bys skips. Além disso, seu construtor também possui um parâmetro que indica se deve abrir o arquivo no modo somente leitura ("r") ou no modo de leitura-gravação ("rw") (exatamente o mesmo que o fopen () de c). Não suporta gravar apenas arquivos.
Somente o RandomAccessFile possui um método de busca de busca, e esse método é aplicável apenas a arquivos. BufferInputStream possui um método Mark (), que você pode usar para definir a marca (salve o resultado em uma variável interna) e, em seguida, chama RESET () para retornar a essa posição, mas sua função é muito fraca e não é muito prática.
A maioria das funções do RandomAccessFile, mas não todas, foi substituída pelos "arquivos mapeados de memória" do JDK 1.4. Você deve considerar se deve usar "arquivos mapeados de memória" em vez do RandomAccessFile.
importar java.io.ioException; importar java.io.randomaccessfile; classe pública testrandomaccessfile {public static void main (string [] args) lança IoException {RandomAccessFile rf = new RandomAccessFile ("rtest.dat", "rw"); for (int i = 0; i <10; i ++) {// grava o tipo básico de dados duplo rf.Writedouble (i * 1.414); } rf.close (); rf = new RandomAccessFile ("rtest.dat", "rw"); // Gire diretamente mova o ponteiro do arquivo para o 5º dados duplo RF.SEEK (5 * 8); // substituir o 6º DuDo Double Data RF.Writedouble (47.0001); rf.close (); rf = new RandomAccessFile ("rtest.dat", "r"); for (int i = 0; i <10; i ++) {System.out.println ("value" + i + ":" + rf.readDouble ()); } rf.close (); }}Arquivo mapeado de memória
Os arquivos mapeados de memória permitem criar e modificar arquivos que são grandes demais para serem colocados na memória. Com o arquivo mapeado de memória, você pode pensar que o arquivo foi lido na memória e acessá -lo como uma matriz muito grande. Esta solução pode simplificar bastante o código de modificação de arquivos.
Filechannel.map (modo Filechannel.MapMode, posição longa, tamanho longo) mapeia a área de arquivo desse canal diretamente na memória. Observe que você deve indicar de onde ele é mapeado e quão grande é o alcance do mapa; Ou seja, também pode mapear um pequeno fragmento de um arquivo grande.
O MAPPEDBYTEBUFFER é uma subclasse do ByTeBuffer, por isso possui todos os métodos de ByTeBuffer, mas uma nova força () é adicionada para forçar a atualização do conteúdo do buffer no dispositivo de armazenamento, carregamento () carrega os dados no dispositivo de armazenamento na memória e é carregado () no local da memória. Aqui, apenas demonstramos brevemente os métodos put () e get (). Além disso, você também pode usar métodos como ascharbuffer () para obter a visualização em buffer dos dados de tipo básico correspondentes, que podem ler e escrever dados de tipo básico facilmente.
importar java.io.randomaccessfile; importar java.nio.MapDByteBuffer; importar java.nio.channels.FileChannel; Classe pública Largemappedfiles {static int length = 0x8000000; // 128 mb public static void main (string [] args) lança exceção {// Para abrir o arquivo de maneira legível e gravável, o RandomAccessFile é usado aqui para criar o arquivo. Filechannel fc = new RandomAccessFile ("test.dat", "rw"). GetChannel (); // Observe que o canal de arquivo legível e gravável deve ser baseado no próprio fluxo de arquivo legível e gravável. MapedbyteBuffer out = fc.map (filechannel.mapmode.read_write, 0, comprimento); // Escreva o conteúdo 128m para (int i = 0; i <comprimento; i ++) {out.put ((byte) 'x'); } System.out.println ("Concluído escrita"); // Leia 6 bytes do meio do arquivo para (int i = comprimento / 2; i <comprimento / 2+6; i ++) {System.out.print ((char) out.get (i)); } fc.close (); }}Embora pareça que o FileOutputStream é usado para gravar mapeamento, todas as saídas no arquivo de mapeamento devem usar o RandomAccessFile, mas se você precisar ler apenas o FileInputStream, você deverá usar o arquivo de acesso aleatório ao gravar arquivos de mapeamento. Talvez o motivo da leitura ao escrever.
O programa cria um arquivo de 128 MB. Se você ler a memória ao mesmo tempo, isso pode causar excesso de memória, mas o acesso aqui parece ser apenas um momento, porque apenas uma pequena parte dela é realmente transferida para a memória e o restante é colocado no arquivo swap. Dessa forma, você pode modificar facilmente arquivos super-grande (até 2 GB). Observe que o Java chama o "mecanismo de mapeamento de arquivos" do sistema operacional para melhorar o desempenho.
Aplicação da classe RandomAccessFile:
/ * * Função do programa: demonstre as operações da classe RandomAccessFile e implemente uma operação de cópia de arquivo. */ pacote com.lwj.demo; importar java.io.*; classe pública RandomAccessFiledEMo {public static void main (string [] args) lança exceção {RandomAccessFile arquivo = new RandomAccessFile ("arquivo", "rw"); // o seguinte grava dados no arquivo file.writeint (20); // ocupa 4 bytes file.wrateouble (8.236598); // ocupa 8 bytes file.writeutf ("Esta é uma string utf"); // Este comprimento é escrito nos dois primeiros bytes do ponteiro de arquivo atual. File.WriteBoolean (true); // ocupa 1 byte file.writeshort (395); // ocupa 2 bytes file.writelong (2325451l); // ocupa 8 bytes file.writeutf ("outra string utf"); file.writefloat (35.5f); // ocupa 4 bytes file.writechar ('a'); // ocupa 2 bytes file.seek (0); // Defina a posição do ponteiro do arquivo para o início do arquivo // o seguinte é ler dados do arquivo de arquivo. Preste atenção à localização do sistema de ponteiro de arquivo.out.println (" - - - - - - - - - - - - - - -; Bytes e, neste caso, um valor booleano e um valor curto são ignorados. System.out.println (file.readfloat ()); byte [] b = novo byte [len]; RandomAccessFile Inserção Escreva Exemplo:
/ **** @param pular quantos bytes pularem para inserir dados* @param str string para inserir* @param arquivo de nome do arquivo*/ public static void beiju (pular long, string str, string filename) {try {RandomAccessFile RAF = novo RandomAccessFile (FILENAME, "RW"; if (Skip <0 || Skip> Raf.Length ()) {System.out.println ("Skip Número de bytes ignorados é inválido"); retornar; } byte [] b = str.getBytes (); Raf.setLength (Raf.Length () + B.Length); for (i = raf.length () - 1; i> b.Length + Skip - 1; i -) {Raf.seek (i - B.Length); byte temp = raf.readbyte (); RAF.SEEK (I); RAF.WRITEBYTE (TEMP); } raf.seek (Skip); RAF.WRITE (B); raf.close (); } catch (Exceção e) {e.printStackTrace (); }}Use RandomAccessFile para realizar download de arquivos com vários threads, ou seja, quando vários threads baixam um arquivo, o arquivo é dividido em várias peças e cada peça é baixada com um thread diferente. Aqui está um exemplo de uso de multithreading ao escrever arquivos, onde o espaço necessário para o arquivo é pré-alocado, depois jogado no espaço alocado e depois escrito:
importar java.io.filenotfoundException; importar java.io.ioException; importar java.io.randomaccessfile; /*** Teste usando o Multithreading para operações de escrita de arquivos*/Public Class Test {public static void main (string [] args) lança exceção {// Espaço de disco pré-alocado, um arquivo de tamanho especificado será criado no disco RandomAccessFile RAF = novo RandomAccessFile ("d: //abc.txt" ""; Raf.setLength (1024*1024); // Espaço de arquivo 1M pré-alocado RAF.Close (); // Arquivo Conteúdo a ser escrito String S1 = "First String"; String S2 = "Segunda String"; String s3 = "terceira string"; String s4 = "Quarta string"; String s5 = "quinta string"; // Escreva um arquivo ao mesmo tempo usando vários threads new FileWriteThread (1024*1, s1.getBytes ()). Start (); // grava dados de 1024 bytes do arquivo new FileWriteThread (1024*2, s2.getBytes ()). Start (); // grava dados de 2048 bytes do arquivo new FileWriteThread (1024*3, s3.getBytes ()). Start (); // grava dados de 3072 bytes do arquivo new FileWriteThread (1024*4, s4.getBytes ()). Start (); // grava dados de 4096 bytes do arquivo new FileWriteThread (1024*5, s5.getBytes ()). Start (); // grava dados de 5120 bytes do arquivo} // Use um thread para gravar dados especificados no local especificado da classe estática do arquivo FileWriteThread estende thread {private int skip; Byte privado [] conteúdo; public fileWriteThread (int skip, byte [] content) {this.skip = skip; this.content = content; } public void run () {RandomAccessFile RAF = null; tente {RAF = new RandomAccessFile ("d: //abc.txt", "rw"); RAF.SEEK (SKIP); RAF.WRITE (Content); } catch (filenotfoundException e) {e.printStackTrace (); } catch (ioexception e) {// TODO GATO GENERADO AUTOMENTADO BLOCO E.PRINTSTACKTRACE (); } finalmente {tente {raf.close (); } catch (Exceção e) {}}}}}}}A explicação detalhada do uso do Java RandomAccessFile acima é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.