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