Pergunta

Eu estou procurando uma maneira eficiente de criar um arquivo cujo tamanho é desconhecida, mas pode variar de mb de a GB de e encher o seu conteúdo de forma aleatória. Eu posso escrever primeiros 200 bytes do que saltar para o fim e escrever últimos 200 bytes e passar para o meio e escrever lá. É RandomAccessFile eficiente para fazer isso ou há alternativas mais adequadas para este tipo de trabalho?

Foi útil?

Solução

Sim, o uso RandomAccessFile - que é o que está lá. Você poderia potencialmente usar um FileChannel, mas eu iria para RandomAccessFile primeiro. - É provável que seja mais simples

Note que você não será capaz de "inserção no meio" do arquivo depois de escrever a parte final: Eu não conheço nenhum sistema de arquivos que suporta isso. Você precisa saber o tamanho completo antes de escrever a seção final, basicamente. Uma alternativa seria escrever sequencialmente, lembrando o bit final até o fim.

Se você pode nos dar mais informações sobre o que você precisa fazer (e quando você tem informações sobre o tamanho) que pode ser capaz de ajudá-lo mais.

EDIT: Para criar o arquivo com um tamanho específico, você pode seek() passado o fim e, em seguida, escrever dados:

import java.io.*;

public class Test
{
    // Just for the sake of a simple test program!
    public static void main(String[] args) throws Exception
    {
        RandomAccessFile file = new RandomAccessFile("file.dat", "rw");

        file.seek(100);
        file.write(0);
        file.close();
    }
}

Após este saiu, file.dat será 101 bytes de comprimento. (Note que normalmente você pode usar try / finally etc.)

EDIT: Como coobird mencionado nos comentários, setLength() também irá estender o arquivo - mas que também irá truncar o arquivo se você der um comprimento menor do que o tamanho atual. Dado o seu comentário sobre a escrita basicamente dados de torrent, eu suspeito que procura e, em seguida, escrever é exatamente o comportamento que você quer. Quando você recebe um pedaço, apenas procuram o ponto certo, escrevê-lo, e o arquivo irá estender-se quando ele precisa.

Outras dicas

RandomAccessFile deve fazê-lo

Eu acho que RandomAccessFile é bom para este problema

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top