2010-06-12 16 views

cevap

10

Hayır, temeldeki dosyanın boyutunu ayarlamanız ve Memory Mapped Byte Buffer'ı yeniden oluşturmanız gerekir.

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

Not: Dosya uzunluğunun ayarlanması biraz garip davranışlara sahiptir. Eğer dosya üzerinden haritanın sonuna doğru bir dosyaya yazarsanız (map.position() veya map.putX (position, ...) kullanarak), değerler sonuna kadar eklenecektir. Dosya ve beklediğiniz konumda yazmayın (en azından linux üzerinde). Bu istenmeyen davranışsa, dosyayı gerçekten büyütmek için dosyaya veri eklemeniz gerekir.

+0

Diğer garip davranışları açıklar mısınız? Sonunun ötesini yazıyorsam, dosyanın sonuna eklemem (tüm dosya boyutunu eşleştiren haritalanmış arabellek aracılığıyla) değil mi? – geeko

+1

50 bayt boyutunda bir dosyayla başlayın. Dosyanın boyutunu artırmak için setLength (1000) öğesini çağırın. Daha sonra yeni bir harita yaratın (file.getChannel(). Map (..., 0, 1000). Eğer yeni MappedByteBuffer'da putByte (500, (byte) 'x') olarak adlandırırsanız, 'x' değeri Dosyada 50th bayt olarak (0-tabanlı dizin) 500 konumunda değil (belki garip değil, ama potansiyel olarak beklenmedik davranış) –

+0

Ne demek istediğini görebiliyorum Teşekkür ederim michael. – geeko

İlgili konular