Входящи потоци, InputStream

Има две паралелни йерархии на входни класове:InputStreamи Reader. Класът Reader е въведен в последните версии на Java. Тази статия обсъжда въпроса за използването на байтов входен потокInputStream, чиято йерархия е показана на следващата фигура.

входящи

ПотокПотоке абстрактна концепция за източник на данни или приемник, който може да обработва информация. Има два типа потоци: байт и знак. В някои ситуации символните потоци са по-ефективни от байтовите потоци. Класовете, получени от базовияInputStreamилиReaderимат методиread()за четене на единични байтове или масив от байтове.

InputStream

Базовият класInputStreamе абстрактен клас, който дефинира входен поток от данни и е родител за класове, които получават данни от различни източници: масив от байтове, низове (String), файлове, канали, в които едната страна е вход, а втората страна играе ролята на изход и др. Методите на класа InputStream хвърлят изключениеIOException, когато възникне грешка.

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

КласътInputStreamчесто действа като параметри на конструктори или методи на различни класове. Според правилата за наследяване, това означава, че обект от произволен клас може да бъде предаден като параметър. Това ни позволява да комбинираме класове, за да постигнем целите си.

ByteArrayInputStream

КласътByteArrayInputStreamизползва байтов масив като източник на данни. Има следните конструктори:

Като параметри, конструкторитеByteArrayInputStreamвземат масива от байтове buf за четене, отместването спрямо началото на масива от отместване и числотодължина на прочетените знаци.

Пример за четене на масив от байтове към конзолата:

За разлика от други класове на потока, затварянето на обектByteArrayInputStreamне изисква извикване на метода close.

FileInputStream

FileInputStream- основният клас от тази йерархия за работа с файлове. Има два основни конструктора.

FileInputStreamе описан подробно на страницата Файлове и директории

FilterInputStream

FilterInputStreamе абстрактен клас, който предоставя интерфейс за допълнителни класове, които добавят полезни свойства към съществуващи потоци. FilterInputStream е основният клас за другите два класа. Единственият му конструктор изисква предаване на обект от класа InputStream като параметър, т.е. всъщност обект от някакъв неабстрактен клас, извлечен от InputStream.

Директното използване наFilterInputStreamв програма не е практично.

BufferedInputStream

BufferedInputStream се използва за организиране на по-ефективно "буферирано" въвеждане на данни. I/O буферирането е удобен начин за оптимизиране на производителността, като ви позволява да обвиете всеки InputStream в обвивка.

В конструктора на клас BufferedInputStream трябва да подадетеInputStream. В този случай такъв обект е екземпляр на класаByteArrayInputStream.

Както всички входни потоци, BufferedInputStream има метод read(), който чете данни, използвайки метода read от буферния масив.

Всъщност, същото нещо може да се направи с единByteArrayInputStreamбез да се прибягва до буфериран поток. Класът BufferedInputStream просто оптимизира производителността при работа с ByteArrayInputStream.

DataInputStream

За да прочетете байтови данни (не низове), използвайте класаDataInputStream. В този случай трябва да използвате класовете от групата InputStream. Методът getBytes() е предоставен в класа String за преобразуване на низ в масив от байтове, подходящ за поставяне в ByteArrayInputStream. Полученият ByteArrayInputStream е InputStream, подходящ за предаване на DataInputStream.

При четене на знаци байт по байт от форматиран потокDataInputStream чрез метода readByte(), всяка получена стойност ще се счита за валидна, така че върнатата стойност не е приложима за идентифициране на края на потока. Вместо това можете да използвате метода available(), който ви казва колко знака остават.

Конструктор на класDataInputStream:

DataInputStream методи

Описание на метода
boolean readBoolean()байт булева еднобайтова стойност
байт readByte()байт един байт
char readChar()char стойност байт
двойно четенеDouble()байтове от осембайтова двойна стойност
float readFloat()четене на четирибайтова плаваща стойност
int readInt()четене на целочислена стойност int
дълго четенеLong()четене на дълга стойност
кратко readShort()четене на кратка стойност
Низ readUTF()четене на UTF-8 кодиран низ
int skipBytes(int n)пропуснете четене на n байта

Пример за четене от двоичен файл с помощта наDataInputStream

ObjectInputStream

КласObjectInputStreamотговаря за четенето на предварително сериализирани данни от потока. В конструктора той взема препратка към входния поток:

Основни методи на класObjectInputStream:

Описание на метода
intread()четене на един байт; връща неговото цяло число
boolean readBoolean()четене на една булева стойност
байт readByte()четене на един байт
char readChar()четене на един символ
двойно четенеDouble()четене на двойна стойност
float readFloat()четене на плаваща стойност
int readInt()четене на целочислена стойност int
дълго четенеLong()четене на дълга стойност
кратко readShort()четене на стойност от тип short
Низ readUTF()четене на UTF-8 кодиран низ
Обект readObject()четене на обект
int skipBytes(int len)пропускане при четене на множество байтове, чийто брой е равен на len
int наличен()прочете броя на четливите байтове
void close()затваряне на поток

Пример за четене на обект Person от файл:

Клас PipedInputStream

КласътPipedInputStreamе специален клас, използван за комуникация на отделни програми (нишки) една с друга в рамките на една и съща JVM. Този клас е важен инструмент за организиране на синхронизиране на нишки.

Пример за просто използване на PipedInputStream: