Java: InputStream. Входни потоци

Java, както и много съвременни езици за програмиране, която поддържа реализацията на потоци от данни. В Java InputStream е базовият клас за байтови потоци. Този клас е абстрактен, т.е. в процеса на програмата не можем да създадем копие от него. Пакетът обаче има много класове, които наследяват и разширяват функционалността на InputStream. За да използвате този клас в кода си, трябва да го импортирате от пакета java.io.InputStream. След това ще разгледаме основните функции, предоставени от класа InputStream, както и основните класове, които го прилагат.


Методи на класовете InputStream

Преди да пристъпи към подробното проучване на методите на класа InputStream, трябва да се отбележи, че той изпълнява интерфейсите Closeable и AutoCloseable. Интерфейсът Closeable ни казва, че когато приключите работа с нишка, трябва да го затворите. Това се прави с помощта на метода close (). Тъй като повечето InputStream методи в случай на грешка генерират изключение за IOException, всички операции трябва да бъдат изпълнени в try блока, а методът close () се предава на блока най-накрая да работи независимо от резултата в опита тялото. Интерфейсът AutoCloseable значително намалява обхвата на техническия код, тъй като позволява методът close () да работи автоматично и не добавя блока най-накрая към вашия код. Ако използвате седма или по-нова версия на Java, InputStream може да бъде поставен в така наречения опит с ресурси, които извършват всички операции по изключване.


Да разгледаме основните методи на класа InputStream:
  • int available () - връща читаемия номербайта;
  • int read () - взема от ресурса текущия байт и го връща в цяло число; ако всички байтове се четат, то връща -1; [Int]
  • int read (byte [] buffer) - чете наличните байтове в указания буфер под формата на масив от байт (броят на байтовете за четене на един определен размер на буфера; връща броя на байта, които са били четими; -1);
  • int read (byte [] буфер, int shift, int брой байтове) - претоварване на предишния метод, правим същото, но с посоченото в "елиминиране" на позицията и чете толкова, колкото е посочено в "брой байтове" ;
  • дълъг пропуск (дълъг брой байтове) - прескача определен брой байтове и връща действителния брой пропуснати.
  • InputStream се изпълнява от няколко класа, предназначени за работа с различни източници и типове данни. По-долу е дървото на наследството.

    Четене на файлове

    Байтовият поток за четене на информация от файлове се изпълнява от класа FileInputStream. За да отворите файл за четене на байтове, достатъчно е да създадете екземпляр от този клас, като предавате името на файла на конструктора като аргумент. Ако файлът с предаваното име не съществува, ще бъде генерирано изключение за типа FileNotFoundException. В случай на успешно отваряне на файл, работата с него се извършва с помощта на описаните по-горе методи, тъй като FileInputStream е наследник на InputStream.

    Четене на примитивни типове данни

    В предишния пример се описва работа с байтови стойности, които могат да се интерпретират като символи. Но какво, ако трябва да прочетем цяло число, дробно или логично? затова в Java InputStream се разширява непряко от класа DataInputStream. Този клас е обвивка за InputStream, която се предава при създаването на аргумент на конструктор. Този вид поток чете данни в двоична форма.
    DataInputStream също изпълнява интерфейса DataInput и неговите методи за четене на примитивни типове данни. По-долу е даден списък на тези методи.
    Имената на методите говорят сами за себе си - всеки от тях е предназначен за четене на определен тип данни.

    Буфериран поток от вход

    Буферираният поток от данни се изпълнява от класа BufferedInputStream в Java. InputStream е обвивката на този клас. Този клас допълва поточния буфер, който ви позволява да четете едновременно не един, а няколко байта. Това дава възможност значително да се увеличи ефективността на операцията. BufferedInputStream е пряк потомък на InputStream и съответно наследява всички горепосочени методи. Този клас има два конструктора:
  • BufferedInputStream (входен поток InputStream);
  • BufferedInputStream (входен поток InputStream, int буфер размер)
  • От подпис на конструктори, може да се разбере, че първият определя размера на буфера по подразбиране, а във второто е възможно ръчно да ги зададете.

    Заключение

    Разгледахме основните реализации на InputStream. Ако трябва да преобразувате получените байтове в низ, Java InputStream в String () за съжаление не е претоварен, така че ще трябва да използвате специални помощни програми като IOUtils от библиотеката Apache Commons.

    Свързани публикации