
- •1. Історія створення Java.
- •2. Історія розвитку Java
- •3.Опишіть поняття “об’єкт”
- •4. Опишіть поняття “клас”
- •5. Опишіть типи відношень між класами
- •6. Переваги і недоліки об’єкто-зорієнтованого програмування
- •7. Опишіть правила побудови ідентифікаторів мови Java, наведіть приклади
- •8. Поняття літералів. Приклади
- •9. Оператори та операції в мові Java
- •11. Типи даних у мові Java
- •12. Клас Object
- •13. Клас String
- •14. Клас Class
- •15. Імена в Java
- •16. Пакети в Java
- •17. Область видимості імен
- •18.Об’ява класів у Java
- •19.Приведення типів у Java
- •21.Приведення посилальних типів даних.
- •22.Приведення до рядка.
- •23.Заборонені приведення.
- •24.Застосування приведення типів.
- •25.Статичні елементи.
- •26. Ключові слова this і super.
- •27. Ключове слово abstract.
- •28. Поняття інтерфейсів.
- •29. Поліморфізм.
- •30. Масиви в Java.
- •31. Приведення типів для масивів.
- •32. Клонування масивів.
- •33. Керування ходом виконання програми.
- •34. Нормальне і перерване виконання операторів.
- •35. Блоки і локальні змінні.
- •36. Порожній оператор.
- •38. Синтаксис оператора if.
- •39. Синтаксис оператора switch.
- •40. Керування циклами.
- •41.Синтаксис оператора while
- •42.Ситаксис оператора do
- •43.Синтаксис оператора for
- •44.Оператори break I continue
- •45.Іменовані блоки
- •46. Оператор return
- •47. Оператор synchronized
- •48. Помилки при роботі програми. Виняткові ситуації
- •48. Помилки при роботі програми. Виняткові ситуації
- •49.Причини виникнення помилок
- •50.Обробки виняткових ситуацій
- •51.Конструкція try-catch-finally
- •52.Використання оператора throw
- •53.Виняткові ситуації, які перевіряються і які не перевіряються
- •54.Створення класів користувача обробки виняткових ситуацій
- •55.Поняття потокв в Java
- •56.Базові класи для роботи з потоками
- •57.Класс Thread
- •58. Інтерфейс Runnable
- •60. Потоки-демони
- •61.Синхронізація роботи потоків.
- •62.Класи обгортки для примітивних типів.
- •63.Клас Math.
- •66.Клас Calendar.
- •67.Клас TimeZone.
- •68. Колекції java
- •69.Інтерфейс Collection.
- •70.Інтерфейс Set.
- •71.Інтерфейс List.
- •72.Інтерфейс Map.
- •73.Інтерфейс SortedSet.
- •74.Інтерфейс SortedMap.
- •75.Інтерфейс Iterator.
- •76.Конкретні класи колекцій.
- •77.Клас Properties.
- •78. Інтерфейс Comparator.
- •79.Клас BitSet.
- •80.Клас Random.
- •81.Система введення/виведення. Потоки даних.
- •82.Класи реалізації потоків даних.
- •84. Робота із файловою системою.
- •59. Робота із пріоритетами потоків
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а і масив. Напочатку, програма записує до потоку об’єкти – дати, масиву, який містить значення температур і масиву стрінгів, які є описами для значень температури. Далі об’єкти вибираються з потоку і можуть довільним чином бути зміненими.