2010-06-12 13 views

Odpowiedz

10

Nie, musisz zmienić rozmiar pliku bazowego i odtworzyć bufor mapowania pamięci.

RandomAccessFile file = new RandomAccessFile(/* some file */); 
MappedByteBuffer buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

// Some stuff happens... 

// adjust the size 
file.setLength(newLength); 

// recreate the memory mapped buffer 
buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

Uwaga: Ustawienie długości pliku ma nieco dziwne zachowanie. Jeśli napiszesz do pliku przez mapę w określonej pozycji, która znajduje się poza końcem pliku (używając map.position() lub map.putX (position, ...)) wartości zostaną dodane na końcu plik i nie został zapisany w oczekiwanej pozycji (przynajmniej w systemie Linux). Jeśli jest to niepożądane zachowanie, musisz dodać dane do pliku, aby naprawdę rozwinąć plik.

+0

Czy mógłbyś wyjaśnić dziwne zachowanie innymi słowy? Czy nie oczekuje się dołączenia do końca pliku, jeśli napiszę poza jego końcem (za pomocą odwzorowanego bufora, zakładając, że mapuje on cały rozmiar pliku)? – geeko

+1

Rozpocznij od pliku o rozmiarze 50 bajtów. Call setLength (1000), aby zwiększyć rozmiar pliku. Następnie utwórz nową mapę z pliku (file.getChannel(). Map (..., 0, 1000) .Jeśli na nowym MappedByteBuffer nazwiesz putByte (500, (bajt) "x '), wartość' x 'będzie pojawia się jako 50. bajt w pliku (indeks oparty na 0) nie na pozycji 500 (może nieparzysty, ale potencjalnie nieoczekiwany). –

+0

Widzę, co masz na myśli dziękuję, michael, – geeko

Powiązane problemy