Java NIO - bufor
Bufory w Java NIO mogą być traktowane jako prosty obiekt, który działa jako kontener fragmentów danych o ustalonej wielkości, który może być używany do zapisywania danych w kanale lub odczytywania danych z kanału, dzięki czemu bufory pełnią rolę punktów końcowych kanałów.
Zapewnia zestaw metod, które ułatwiają obsługę bloku pamięci w celu odczytu i zapisu danych do iz kanałów.
Bufory sprawiają, że pakiet NIO jest wydajniejszy i szybszy w porównaniu do klasycznych IO, ponieważ dane IO są przetwarzane w postaci strumieni, które nie obsługują asynchronicznego i współbieżnego przepływu danych, a także IO nie pozwala na wykonanie danych w kawałku lub grupie bajtów .
Podstawowe parametry definiujące bufor Java NIO można zdefiniować jako -
Capacity - Maksymalna ilość danych / bajtów, które mogą być przechowywane w buforze. Pojemność bufora nie może zostać zmieniona. Po zapełnieniu bufora należy go wyczyścić przed zapisaniem do niego.
Limit - Limit ma znaczenie zgodnie z trybem bufora, tj. W trybie zapisu Buffer Limit jest równy pojemności, co oznacza, że maksymalna ilość danych, które można zapisać w buforze, podczas gdy w trybie odczytu bufora Limit oznacza limit ilości danych, które można zapisać. czytać z bufora.
Position - Wskazuje bieżące położenie kursora w buforze, początkowo ustawiane na 0 w momencie tworzenia bufora lub innymi słowy jest to indeks następnego elementu do odczytania lub zapisania, który jest aktualizowany automatycznie przez get () i put ( ) metody.
Mark - Zaznacz zakładkę pozycji w buforze Po wywołaniu metody mark () bieżąca pozycja jest zapisywana, a wywołanie reset () przywraca zaznaczoną pozycję.
Typ bufora
Bufory Java NIO można podzielić na następujące warianty na podstawie typów danych, z którymi ma do czynienia bufor -
- ByteBuffer
- MappedByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
Ważne metody Buffer
Jak już wspomniano, Buffer działa jako obiekt pamięci, który zapewnia zestaw metod, które ułatwiają obsługę bloku pamięci. Poniżej przedstawiono ważne metody Buffer -
allocate(int capacity) - Ta metoda służy do przydzielania nowego bufora z pojemnością jako parametrem. Metoda Allocate zgłasza wyjątek IllegalArgumentException w przypadku, gdy przekazana pojemność jest ujemną liczbą całkowitą.
read() and put() - metoda odczytu kanału służy do zapisu danych z kanału do bufora, natomiast put jest metodą bufora, która służy do zapisywania danych w buforze.
flip() - Metoda odwracania przełącza tryb bufora z trybu zapisu na tryb odczytu, a także ustawia pozycję z powrotem na 0 i ustawia limit do miejsca, w którym pozycja była w momencie pisania.
write() and get() - metoda zapisu kanału służy do zapisywania danych z bufora do kanału, podczas gdy get jest metodą bufora, która służy do odczytu danych z bufora.
rewind() - metoda przewijania jest używana, gdy wymagane jest ponowne odczytanie, ponieważ ustawia pozycję z powrotem na zero i nie zmienia wartości limitu.
clear() and compact() - jasne i kompaktowe obie metody są używane do zmiany trybu buforowania z trybu odczytu na zapis.clear() metoda ustawia pozycję na zero, a limit jest równy pojemności, w tej metodzie dane w buforze nie są kasowane, tylko znaczniki są ponownie inicjalizowane.
Z drugiej strony compact() metoda jest używana, gdy pozostały jakieś nieodczytane dane i nadal używamy trybu zapisu bufora w tym przypadku metoda kompaktowa kopiuje wszystkie nieprzeczytane dane na początek bufora i ustawia pozycję bezpośrednio po ostatnim nieprzeczytanym elemencie. Właściwość limit jest nadal ustawiony na pojemność.
mark() and reset() - Jak nazwa sugeruje, metoda mark służy do zaznaczania określonej pozycji w buforze, podczas gdy resetowanie powoduje powrót do zaznaczonej pozycji.
Przykład
Poniższy przykład przedstawia implementację wyżej zdefiniowanych metod.
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class BufferDemo {
public static void main (String [] args) {
//allocate a character type buffer.
CharBuffer buffer = CharBuffer.allocate(10);
String text = "bufferDemo";
System.out.println("Input text: " + text);
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
//put character in buffer.
buffer.put(c);
}
int buffPos = buffer.position();
System.out.println("Position after data is written into buffer: " + buffPos);
buffer.flip();
System.out.println("Reading buffer contents:");
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
//set the position of buffer to 5.
buffer.position(5);
//sets this buffer's mark at its position
buffer.mark();
//try to change the position
buffer.position(6);
//calling reset method to restore to the position we marked.
//reset() raise InvalidMarkException if either the new position is less
//than the position marked or merk has not been setted.
buffer.reset();
System.out.println("Restored buffer position : " + buffer.position());
}
}
Wynik
Input text: bufferDemo
Position after data is written into buffer: 10
Reading buffer contents:
b
u
f
f
e
r
D
e
m
o
Restored buffer position : 5