2012-03-04 10 views
6

Próbuję napisać funkcję, która pobiera parametry obiektu File, offset i tablica bajtów i zapisuje tę tablicę bajtów do obiektu File w Javie.Przesyłanie Java OutputStream (offset)

więc funkcja będzie wyglądać

public void write(File file, long offset, byte[] data) 

Ale problemem jest to, że przesunięcie parametrem jest typ długi, więc nie mogę używać write (stanowisko) OutputStream, który bierze całkowitą jako offset.

W przeciwieństwie do InputStream, który ma pomijanie (long), wydaje się, że OutputStream nie ma możliwości pominięcia pierwszych bajtów pliku.

Czy istnieje dobry sposób na rozwiązanie tego problemu?

Dziękuję.

+0

Największa liczba, jaką można wstawić do "int" to 2 147 483 647. Czy tablice, które chcesz napisać, są większe niż + - 2 GB? –

+0

Tylko dla wyjaśnienia: przesunięcie dotyczy tylko pozycji w * tablicy *, a nie strumienia wyjściowego, prawda? W OutputStream nie można pominąć pozycji. –

+0

@TheNail offset odnosi się do przesunięcia od początku pliku, a nie do początku tablicy. I jeśli nie używasz FAT jako systemu plików, możesz mieć pliki większe niż 2 GB. – Dunes

Odpowiedz

11
try { 
    FileOutputStream out = new FileOutputStream(file); 
    try { 
     FileChannel ch = out.getChannel(); 
     ch.position(offset); 
     ch.write(ByteBuffer.wrap(data)); 
    } finally { 
     out.close(); 
    } 
} catch (IOException ex) { 
    // handle error 
} 
4

Ma to związek z semantyką strumieni. W strumieniu wejściowym mówisz tylko, że odrzucasz pierwsze n bajtów danych. Jednak z OutputStream coś musi być napisane do strumienia. Nie można po prostu zapytać, że strumień udaje, że n bajtów danych zostało zapisanych, ale w rzeczywistości ich nie zapisuje. Powodem tego jest to, że nie wszystkie strumienie będą widoczne. Dane przesyłane przez sieć nie są widoczne - dane są zbierane raz i tylko raz. Jednak tak nie jest w przypadku plików, ponieważ są one przechowywane na dysku twardym i łatwo można je znaleźć w dowolnej pozycji na dysku twardym.

Rozwiązanie: Użyj instancji pod FileChannels lub RandomAccessFile.

1

Jeśli chcesz napisać na końcu pliku, a następnie użyć trybie dopisywania (FileOutputStream (String name, logiczna append)). W mojej skromnej opinii, powinna istnieć metoda pomijania w FileOutputStream, ale na razie jeśli chcesz podróżować do określonej lokalizacji w pliku do zapisu, musisz użyć poszukiwanego FileChannel lub RandomAccessFile (jak to było wymienione przez innych).

Powiązane problemy