Java: InputStream. Strumienie wejściowe

Java, a także wiele nowoczesnych języków programowania, które obsługuje implementację strumieni danych. W Javie InputStream jest klasą podstawową dla strumieni bajtów. Ta klasa jest abstrakcyjna, to znaczy w trakcie programu nie możemy utworzyć jej kopii. Jednak pakiet io ma wiele klas, które dziedziczą i rozszerzają funkcjonalność InputStream. Aby użyć tej klasy w kodzie, należy zaimportować ją z pakietu java.io.InputStream. Następnie rozważymy podstawową funkcjonalność zapewnianą przez klasę InputStream, a także główne klasy, które ją implementują.


Metody klasy InputStream

Przed przystąpieniem do szczegółowego badania metod klasy InputStream należy zauważyć, że implementuje interfejsy Closeable i AutoCloseable. Interfejs Closeable mówi nam, że po zakończeniu pracy z wątkiem, musisz go zamknąć. Odbywa się to za pomocą metody close (). Ponieważ większość metod InputStream w przypadku błędu generuje wyjątek IOException, wszystkie operacje muszą być wykonywane w bloku try, a metoda close () jest przekazywana do bloku, aby ostatecznie zadziałał niezależnie od wyniku w treści try. Interfejs AutoCloseable znacznie zmniejsza zakres kodu technicznego, ponieważ pozwala on na automatyczne działanie metody close () i nie dodaje bloku do kodu. Jeśli używasz siódmej lub nowszej wersji Java, InputStream można umieścić w tak zwanej próbie z zasobami, która wykonuje wszystkie operacje wyłączania.


Rozważmy podstawowe metody klasy InputStream:
  • int available () - zwraca czytelny numerbajty
  • int read () - pobiera z zasobu bieżący bajt i zwraca go w postaci liczby całkowitej; jeśli wszystkie bajty są odczytywane, zwraca -1;
  • int odczytu (bajt [] bufor) - odczytuje dostępne bajtów określonej buforze w tablicy typu bajt (liczby czytelnych bajtów równych od określonego rozmiaru bufora, zwraca liczbę bajtów do odczytania i, jeżeli wszystkie bajty odczytywane, powraca -1);
  • int odczytu (bajt [] bufor int przesunięcie int liczba bajtów) - przeciążenia powyższej metody ma to samo, ale z określonymi w pozycji „wydalenie” i odczytu jak podano w „liczbie bajtów” ;
  • long skip (długa liczba bajtów) - pomija określoną liczbę bajtów i zwraca rzeczywistą liczbę pominiętych.
  • InputStream jest implementowany przez kilka klas zaprojektowanych do pracy z różnymi źródłami i typami danych. Poniżej znajduje się drzewo dziedzictwa.

    Odczytywanie plików

    Strumień bajtów do odczytu informacji z plików jest implementowany przez klasę FileInputStream. Aby otworzyć plik do odczytu bajtów, wystarczy utworzyć instancję tej klasy, przekazując nazwę pliku do konstruktora jako argument. Jeśli plik z przesłaną nazwą nie istnieje, zostanie wygenerowany wyjątek dla typu FileNotFoundException. W przypadku powodzenia otwierania pliku, praca na nim odbywa się za pomocą metod opisanych powyżej, jako spadkobiercy FileInputStream InputStream.

    odczytu podstawowych typów danych

    W powyższym przykładzie opisano prace wartości bajtu, które mogą być interpretowane jako symbole. Ale co, jeśli musimy odczytać wartość całkowitą, ułamkową lub logiczną? Dlato w Javie InputStream jest pośrednio rozszerzane przez klasę DataInputStream. Ta klasa jest powłoką dla InputStream, która jest przekazywana do niej podczas tworzenia argumentu konstruktora. Ten rodzaj strumienia odczytuje dane w postaci binarnej.
    DataInputStream implementuje także interfejs DataInput i jego metody czytania podstawowych typów danych. Poniżej znajduje się lista tych metod.
    Nazwy metod mówią same za siebie - każda z nich jest przeznaczona do czytania pewnego rodzaju danych.

    Buforowany strumień wejściowy

    Buforowany strumień danych jest implementowany przez klasę BufferedInputStream w Javie. InputStream jest powłoką tej klasy. Ta klasa uzupełnia bufor przepływu, który pozwala na odczyt w tym samym czasie nie jeden, ale kilka bajtów. Umożliwia to znaczne zwiększenie wydajności operacji. BufferedInputStream jest bezpośrednim potomkiem InputStream i odpowiednio dziedziczy wszystkie powyższe metody. Ta klasa ma dwa konstruktory:
  • BufferedInputStream (strumień wejściowy InputStream);
  • BufferedInputStream (strumień wejściowy InputStream, rozmiar bufora int)
  • Z podpisu konstruktorów można zrozumieć, że pierwszy ustawia domyślny rozmiar bufora, a w drugim można je ręcznie ustawić.

    Podsumowanie

    Dokonaliśmy przeglądu głównych implementacji InputStream. Jeśli chcesz przekonwertować odebrane bajty na ciąg, to Java InputStream to String () nie jest niestety przeciążona, więc będziesz musiał użyć specjalnych narzędzi, takich jak IOUtils z biblioteki Apache Commons.

    Powiązane publikacje