Java bellek eşlemeli bayt arabelleğini, yeni boyutun diskteki eşlenen dosyaya geri yansıtılacak biçimde genişletmenin bir yolu var mı?Java Bellek Eşlemeli Bayt Tamponunu Genişletme
11
A
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.
İlgili konular
- 1. Bellek eşlemeli dosyalar: bellek kullanımını izleme
- 2. Bellek eşlemeli dosyalara karşı kilitli işlemler nasıl kullanılır. Net
- 3. Bellek eşlemeli bir dosya olup olmadığını nasıl kontrol edebilirim?
- 4. Bellek eşlemeli dosyaları kullanarak iki JVM arasında nasıl iletişim kurabilirim?
- 5. Clojure'da Java Swing sınıfını genişletme
- 6. Java: Çalışma Saatinde Sınıfı Genişletme
- 7. Java Arayüz Kalıtım ve Genişletme
- 8. MemoryStream vs bir dizi bayt
- 9. OpenCV'de eşlemeli olarak eşlemeyi
- 10. java ek açıklığı java bayt kodu
- 11. Java String.split bellek sızıntısı?
- 12. Java ile bellek erişimi
- 13. Java BigDecimal bellek kullanımı?
- 14. java bellek içi derleme
- 15. Bayt kodlarıyla Java hata ayıklama
- 16. İki Bayt Dizisini karşılaştır? (Java)
- 17. Scala Trait'i ile Java Sınıfını Genişletme
- 18. Java bayt dizisini Scala bayt dizisine nasıl dönüştürebilirim?
- 19. Java bellek içi dosya yapısı?
- 20. Java Şifreli Bellek Sınıfı Yükleyici
- 21. Java ve C++ Paylaşılan Bellek
- 22. Java/Android: Bir yuva üzerinde bir bayt dizisi okuma/yazma
- 23. Çalışma zamanında Java-Bayt Kodunu yükle
- 24. Java/android için iki bayt birleştirme
- 25. Java bayt [] to/from Dize dönüştürme
- 26. JSR/RET neden Java bayt kodunu reddetti?
- 27. Java dört bayt onaltılık sayıyı yazdır
- 28. Java örtülü bayt için örtük dönüşümü
- 29. C++ Boost bellek eşlemeli dosyaları kullanarak disk geri veri yapıları oluşturmak için
- 30. Önemli hata: İzin verilen bellek boyutu 67108864 bayt bitmiş (122880 bayt ayırmaya çalışıldı)
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
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ış) –
Ne demek istediğini görebiliyorum Teşekkür ederim michael. – geeko