Czy istnieje sposób na rozszerzenie bufora bajtowego mapowanego w pamięci Java, tak aby nowy rozmiar był odbijany z powrotem do zmapowanego pliku na dysku?Rozszerzanie bufora bajtów odwzorowanego w pamięci Java
11
A
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.
Powiązane problemy
- 1. Używanie pliku odwzorowanego w pamięci jako pliku wymiany?
- 2. Objaśnienie domyślnego bufora/pamięci podręcznej
- 3. Jak uzyskać deskryptor pliku bufora w pamięci?
- 4. Rozszerzanie klasy Java Swing w Clojure
- 5. Java: Rozszerzanie klasy w środowisku wykonawczym
- 6. Wcf System.InsufficientMemoryException. Nie udało się przydzielić zarządzanego bufora pamięci o wielkości 536870912 bajtów
- 7. Print bajtów z pamięci w C
- 8. Jak najlepiej konwertować tablicę bajtów [] do bufora ciągów znaków
- 9. Java: konwertuj listę bajtów na tablicę bajtów
- 10. Wyślij plik zapisuje do bufora w pamięci (fopen coś, ale pisać do bufora, a nie dysku)
- 11. Jaki jest najskuteczniejszy sposób kopiowania zewnętrznego dostarczonego bufora do bajtów
- 12. Rozszerzanie klasy Java o cechę Scala
- 13. Kopiowanie danych z obiektu odwzorowanego w pamięci dzielonej przy użyciu funkcji sendfile()/fcopyfile()
- 14. Java cipher.doFinal() pisanie dodatkowych bajtów
- 15. Załaduj tablicę bajtów pliku do pamięci
- 16. Dozwolony rozmiar pamięci wynoszący 134217728 bajtów wyczerpany
- 17. Konwersja bajtów i znaków w języku Java
- 18. Załaduj kod bajtów Java w środowisku wykonawczym
- 19. Oblicz hash bez jednoczesnego posiadania całego bufora w pamięci
- 20. W języku Java, jak przekonwertować listę obiektów do tablicy bajtów?
- 21. Utwórz obiekt Java (lub jego odpowiednik), używając tablicy bajtów w pamięci (bez fizycznego pliku).
- 22. Jak obliczyć wykorzystanie pamięci programu java?
- 23. Rozmiar bajta w pamięci - Java
- 24. Struktura plików Java w pamięci?
- 25. Jak serializować wszystkie właściwości obiektu odwzorowanego NHibernate?
- 26. Rozszerzanie application.cfc w podkatalogu
- 27. Rozszerzanie typów w JavaScript
- 28. Rozszerzanie Enum w C#
- 29. Rozszerzanie Promises w ES6
- 30. Czy można załadować plik z tablicy bajtów w pamięci?
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
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). –
Widzę, co masz na myśli dziękuję, michael, – geeko