acesso Java para arquivo grande
-
06-07-2019 - |
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?
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