2009-06-23 15 views
5

Szukam skutecznego sposobu na utworzenie pliku, którego rozmiar jest nieznany, ale może wahać się od mb do gb i wypełniać zawartość losowo. Mogę napisać pierwsze 200 bajtów niż przeskoczyć do końca i napisać ostatnie 200 bajtów i przejść do środka i tam napisać. Czy w tym celu jest wydajne RandomAccessFile, czy są jakieś alternatywy, które są lepiej dostosowane do tego rodzaju pracy?Dostęp Java do dużego pliku

Odpowiedz

10

Tak, użyj RandomAccessFile - po to tam jest. Możesz może potencjalnie używać FileChannel, ale najpierw wybrać RandomAccessFile - prawdopodobnie będzie prostsze.

Należy pamiętać, że po napisaniu części końcowej nie będzie można "wstawić w środku" pliku: nie znam żadnego systemu plików, który to obsługuje. Zanim napiszesz końcową część, musisz znać pełny rozmiar. Alternatywą byłoby pisać sekwencyjnie, pamiętając końcowy bit do końca.

Jeśli możesz podać nam więcej informacji o tym, co musisz zrobić (i kiedy masz informacje na temat rozmiaru), możemy być w stanie Ci pomóc.

EDIT: Aby utworzyć plik o określonej wielkości, można seek() poza końcem, a następnie zapisywać dane:

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(); 
    } 
} 

po tym odszedł, file.dat będzie długo 101 bajtów. (Zauważ, że normalnie użyłbyś polecenia try/finally itp.)

EDYCJA: Jak coobird wspomniany w komentarzach, setLength() również rozszerzy plik - ale spowoduje to również skrócenie pliku, jeśli podasz długość mniejszą niż bieżący rozmiar. Biorąc pod uwagę twój komentarz na temat pisania danych torrentowych, podejrzewam, że poszukiwanie i pisanie jest dokładnie tym, czego pragniesz. Kiedy otrzymasz kawałek, po prostu szukaj w odpowiednim miejscu, zapisz go, a plik rozszerzy się, gdy zajdzie taka potrzeba.

+0

Czy istnieje sposób, aby utworzyć plik z góry zadanym rozmiarze innym niż iteracji i pisania wszystkie zera lub jednego, aby ją wypełnić? –

+0

Edytowanie w celu odzwierciedlenia tego. –

+0

Dzięki, dlatego, że muszę zapisywać losowe części w pliku, wdrażam klienta torrenta, a elementy pojawią się w losowych lokalizacjach w pliku, ale wiem wcześniej, jaki będzie rozmiar całego pliku. –

1

Chyba RandomAccessFile jest w porządku dla tego problemu

Powiązane problemy