Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпори JAVA.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
178.34 Кб
Скачать

82.Класи реалізації потоків даних.

1.2.1 . Класи ByteArrayInputStream і ByteArrayOutputStream

Самий природний і простий джерело , звідки можна зчитувати байти - це, звичайно , масив байт. Клас ByteArrayInputStream представляє потік , що зчитує дані з масиву байт. Цей клас має конструктор , якому як параметр передається масив byte []. Відповідно, при виклику методів read ( ) , повертаються дані будуть братися саме з цього масиву. Аналогічно , для запису байт в масив , використовується клас ByteArrayOutputStream . Цей клас використовує всередині себе об'єкт byte [] , куди записує дані, передані при виклику методів write ( ) . Що б отримати записані в масив дані , викликається метод toByteArray ( )

1.2.2 . Класи FileInputStream і FileOutputStream

Класи FileInputStream використовується для читання даних з файлу. Конструктор цього класу як параметр приймає назву файлу , з якого буде проводитися зчитування . При вказівці рядка імені файлу потрібно враховувати , що саме цей рядок і буде передана системі , тому формат імені файлу і шляху до нього може розрізнятися на різних платформах. Якщо при виклику цього конструктора передати рядок , що вказує на директорію або на неіснуючий файл , то буде кинуто java.io.FileNotFoundException . Зрозуміло , що якщо об'єкт успішно створений , то при виклику його методів read ( ) , повертаються значення будуть зчитуватися з вказаного файлу . Для запису байт в файл використовується клас FileOutputStream . При створенні об'єктів цього класу , тобто при викликах його конструкторів крім вказівки файлу , так само можна вказати , чи будуть дані дописуватися в кінець файлу або файл буде перезаписаний . При цьому , якщо зазначений файл не існує , то відразу після створення FileOutputStream він буде створений. Після , при викликах методів write ( ) , передані значення будуть записуватися в цей файл. По закінченні роботи необхідно викликати метод close ( ) , що б повідомити системі , що робота по запису файлу закінчена. При роботі з FileInputStream метод available ( ) практично напевно поверне довжину файлу , тобто число байт , скільки взагалі з нього можна рахувати. Але не варто закладатися на це при написанні програм , які повинні стійко працювати на різних платформах - метод available () повертає число , скільки байт може бути на даний момент лічено без блокування . Той , момент , що в переважній більшості випадків це число і буде довжиною файлу , є всього лише окремим випадком роботи на деяких платформах

1.2.3 . PipedInputStream і PipedOutputStream

Класи PipedInputStream і PipedOutputStream характерні тим , що їхні об'єкти завжди використовуються в парі - до одного об'єкту PipedInputStream прив'язується точно один об'єкт PipedOutputStream . Ці класи можуть бути корисні , якщо необхідно дані і записати і рахувати в межах одного виконання однієї програми . Використовуються таким чином: створюється по об'єкту PipedInputStream і PipedOutput - Stream , після чого вони можуть бути з'єднані між собою. Один об'єкт PipedOutputStream може бути з'єднаний з рівно одним об'єктом PipedInputStream і навпаки. Сполучений - означає , що якщо в об'єкт PipedOutputStream записуються дані , то вони можуть бать зчитані саме в з'єднаному об'єкті PipedInputStream . Таке з'єднання можна

забезпечити або викликом методу connect ( ) з передачею відповідного об'єкта PipedStream , або передати цей об'єкт ще при виклику конструктора .

1.2.4 . StringBufferInputStream

StringBufferInputStream - виробляє зчитування даних , одержуваних перетворенням символів рядка в байти . Зі зрозумілих причин цей клас не має аналога в класах вихідних потоків .

Якщо для будь-яких цілей , ми хочемо вважати рядок - об'єкт String як набір byte , то можемо скористатися класом StringBufferInputStream . Наприклад , якщо ми вже використовуємо потоки , а деякі дані отримали у вигляді рядка , можна організувати зчитування даних з неї через єдиний інтерфейс. При створенні об'єкта StringBufferInputStream необхідно конструктору передати об'єкт String . Дані , що повертаються методом read ( ) , будуть братися саме з цього об'єкту String . При цьому символи будуть перетворюватися в байти не зовсім точно - будуть враховуватися лише молодші 8 біт у символу (у той час як тип char полягає їх 2 -х байт) .

1.2.5 . SequenceInputStream

Клас SequenceInputStream зчитує дані з інших двох і більше вхідних потоків . При цьому можна вказати два потоку або їх список. Дані будуть вичитуватися послідовно - спочатку всі дані з першого потоку в списку , потім з другого , і так далі. Кінець потоку SequenceInputStream буде досягнутий тільки тоді, коли буде досягнуто кінець потоку , останнього в списку . При створенні об'єкта цього класу в конструктор в якості параметрів передаються об'єкти InputStream - або два примірники або Enumeration з них. Коли викликається метод read ( ) , SequenceInputStream намагається вважати байт з поточного вхідного потоку . Якщо в ньому більше немає даних ( лічену з нього значення дорівнює -1 ) , у цього вхідного потоку викликається метод close ( ) , і наступний вхідний потік стає поточним. Так до тих пір , поки останній вхідний потік не стане поточним , і з нього не будуть лічені всі дані. Тоді , якщо при зчитуванні виявляється , що в поточному вхідному потоці немає більше даних , і більше немає вхідних потоків SequenceInputStream возвращет -1 , тобто оголошує , що даних більше немає. SequenceInputStream автоматично викликає виклик методу close ( ) біля вхідних потоків , у яких досягнуто кінець . Виклик методу close ( ) у SequenceeInputStream закриває цей потік , попередньо закривши всі містяться в ньому вхідні потоки .

83. Серіалізація об’єктів

Об’єкти створені в ході виконання програми знаходяться в операційній пам’яті - в адресному просторі процесу. Проте існування цих об’єктів є нетривалим; коли програма закінчує свою роботу усе, що знаходиться в її адресному просторі підлягає очищенню і не може бути відновленим. Більше того, у випадку коли на об’єкт не існує жодного посилання, системний менеджер пам’яті Java автоматично видалить об’єкт з пам’яті. Технологія серіалізації дозволяє “закріпляти” («фіксувати, утримуватити від знищення») об’єкти. Основні ситуації використання технології серіалізації: - комунікація засобами сокетів (sockets), - приховування об’єкта (його стану) до наступного використання в рамках тієї самої або іншої програми

Процес запису об’єкта у вивідний потік називається серіалізацією об’єкта, а читання об’єкта з потоку – десеріалізацією. Для запису/читання об’єктів використовуються потокові класи ObjectOutputStream або ObjectInputStream

Метод класу ObjectInputStream: void writeObject(Object o) записує (заносить) об’єкт в потік Метод класу ObjectInputStream: Object readObject() вичитує (вибирає) об’єкт з потоку i повертає посилання на нього В потік можуть бути занесені тільки серіалізовані об’єкти. З іншого боку, об’єкт є серіалізованим, якщо його клас реалізує інтерфейс Serializable Відзначимо, що майже всі класи стандартних пакетів Javа реалізують цей інтерфейс. Зокрема, масиви (які є об’єктами спеціальних класів визначених на етапі компіляції) також є серіалізованими. Як приклад наведемо програму, в якій “закріпляються” об’єкти переважно стандартних класів Javа і масив. Напочатку, програма записує до потоку об’єкти – дати, масиву, який містить значення температур і масиву стрінгів, які є описами для значень температури. Далі об’єкти вибираються з потоку і можуть довільним чином бути зміненими.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]