<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.cusu.edu.ua/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
		<id>https://wiki.cusu.edu.ua/index.php?action=history&amp;feed=atom&amp;title=Java_IO</id>
		<title>Java IO - Історія редагувань</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.cusu.edu.ua/index.php?action=history&amp;feed=atom&amp;title=Java_IO"/>
		<link rel="alternate" type="text/html" href="https://wiki.cusu.edu.ua/index.php?title=Java_IO&amp;action=history"/>
		<updated>2026-09-24T03:50:57Z</updated>
		<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
		<generator>MediaWiki 1.23.2</generator>

	<entry>
		<id>https://wiki.cusu.edu.ua/index.php?title=Java_IO&amp;diff=260687&amp;oldid=prev</id>
		<title>V kotyak в 07:56, 11 січня 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.cusu.edu.ua/index.php?title=Java_IO&amp;diff=260687&amp;oldid=prev"/>
				<updated>2017-01-11T07:56:48Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Попередня версія&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версія за 07:56, 11 січня 2017&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Рядок 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Рядок 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Система &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ввода&lt;/del&gt;/&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;вывода&lt;/del&gt;. Потоки даних (stream)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Система &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;вводу&lt;/ins&gt;/&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;виводу&lt;/ins&gt;. Потоки даних (stream)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Переважна більшість програм обмінюються даними із зовнішнім світом. Це,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Переважна більшість програм обмінюються даними із зовнішнім світом. Це,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Рядок 158:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Рядок 158:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Закритий потік не може виконувати операції виводу і не може бути відкритий наново. У&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Закритий потік не може виконувати операції виводу і не може бути відкритий наново. У&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;классеOutputStream реалізація методу close() не проводить ніяких дій.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;классеOutputStream реалізація методу close() не проводить ніяких дій.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[ПКДзJ|На початок курсу]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>V kotyak</name></author>	</entry>

	<entry>
		<id>https://wiki.cusu.edu.ua/index.php?title=Java_IO&amp;diff=103361&amp;oldid=prev</id>
		<title>V kotyak: Створена сторінка: Система ввода/вывода. Потоки даних (stream)  Переважна більшість програм обмінюються даними ...</title>
		<link rel="alternate" type="text/html" href="https://wiki.cusu.edu.ua/index.php?title=Java_IO&amp;diff=103361&amp;oldid=prev"/>
				<updated>2013-10-11T06:46:55Z</updated>
		
		<summary type="html">&lt;p&gt;Створена сторінка: Система ввода/вывода. Потоки даних (stream)  Переважна більшість програм обмінюються даними ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Система ввода/вывода. Потоки даних (stream)&lt;br /&gt;
&lt;br /&gt;
Переважна більшість програм обмінюються даними із зовнішнім світом. Це,&lt;br /&gt;
безумовно, роблять будь-які мережеві застосування – вони передають і отримують&lt;br /&gt;
інформацію від інших комп'ютерів і спеціальних пристроїв, підключених до мережі.&lt;br /&gt;
Виявляється, можна таким самим чином представляти обмін даними між пристроями&lt;br /&gt;
усередині однієї машини. Так, наприклад, програма може прочитувати дані з клавіатури і&lt;br /&gt;
записувати їх у файл, або ж навпаки - прочитувати дані з файлу і виводити їх на екран.&lt;br /&gt;
Таким чином, пристрої, звідки може проводитися прочитування інформації, можуть бути&lt;br /&gt;
найрізноманітнішими – файл, клавіатура, вхідне мережеве з'єднання і так далі То ж&lt;br /&gt;
стосується і пристроїв виводу – це може бути файл, екран монітора, принтер, витікаюче&lt;br /&gt;
мережеве з'єднання і тому подібне Кінець кінцем, всі дані в комп'ютерній системі в&lt;br /&gt;
процесі обробки передаються від пристроїв введення до пристроїв виводу.&lt;br /&gt;
&lt;br /&gt;
Зазвичай частина обчислювальної платформи, яка відповідає за обмін даними, так і&lt;br /&gt;
називається – система вводу/виводу. У Java вона представлена&lt;br /&gt;
пакетом java.io (input/output). Реалізація системи вводу/виводу ускладнюється не тільки&lt;br /&gt;
широким спектром джерел і одержувачів даних, але ще і різними форматами передачі&lt;br /&gt;
інформації. Нею можна обмінюватися в двійковому уявленні, символьному або&lt;br /&gt;
текстовому, із застосуванням деякого кодування (тільки для російської мови їх&lt;br /&gt;
налічується більше 4 штук), або передавати числа в різних уявленнях. Доступ до даних&lt;br /&gt;
може потрібно як послідовний (наприклад, прочитування HTML-сторінки), так і&lt;br /&gt;
довільний (складна робота з декількома частинами одного файлу). Часто для підвищення&lt;br /&gt;
продуктивності застосовується буферизація.&lt;br /&gt;
&lt;br /&gt;
У Java для опису роботи по вводу/виводу використовується спеціальне поняття потік&lt;br /&gt;
даних (stream). Потік даних пов'язаний з деяким джерелом, або приймачем, даних,&lt;br /&gt;
здатним отримувати або надавати інформацію. Відповідно, потоки діляться на вхідні –&lt;br /&gt;
такі, що читають дані і дані, що виходять – передають (що записують). Введення&lt;br /&gt;
концепції stream дозволяє відокремити основну логіку програми, інформацією, що&lt;br /&gt;
обмінюється, з будь-якими пристроями однаковим чином, від низькорівневих операцій з&lt;br /&gt;
такими пристроями вводу/виводу.&lt;br /&gt;
&lt;br /&gt;
У Java потоки природним чином представляються об'єктами. Класи, що описують їх,&lt;br /&gt;
якраз і складають основну частину пакету java.io. Вони досить різноманітні і відповідають&lt;br /&gt;
за різну функціональність. Всі класи розділені на дві частини – одні здійснюють введення&lt;br /&gt;
даних, інші – вивід.&lt;br /&gt;
&lt;br /&gt;
Існуючі стандартні класи допомагають вирішити більшість типових завдань.&lt;br /&gt;
Мінімальною &amp;quot;порцією&amp;quot; інформації є, як відомо, битий, що набуває значення 0 або 1 (це&lt;br /&gt;
поняття також зручно застосовувати на найнижчому рівні, де дані передаються&lt;br /&gt;
електричним сигналом; умовно кажучи, 1 представляється проходженням імпульсу, 0 –&lt;br /&gt;
його відсутністю). Традиційно використовується крупніша одиниця вимірювання – байт,&lt;br /&gt;
об'єднуюча 8 битий. Таким чином, значення, представлене одним байтом, знаходиться в&lt;br /&gt;
діапазоні від 0 до 28-1=255, або, якщо використовувати знак, – від -128 до +127.&lt;br /&gt;
&lt;br /&gt;
Примітивний тип byte в Java в точності відповідає останньому – знаковому діапазону.&lt;br /&gt;
Базові, найбільш універсальні, класи дозволяють прочитувати і записувати&lt;br /&gt;
інформацію саме у вигляді набору байт. Щоб їх було зручно застосовувати в різних&lt;br /&gt;
завданнях, java.io містить також класи, що перетворюють будь-які дані в набір байт.&lt;br /&gt;
Наприклад, якщо потрібно зберегти результати обчислень – набір значень&lt;br /&gt;
типу double – у файл, то їх можна спочатку перетворити на набір байт, а потім ці байти&lt;br /&gt;
записати у файл. Аналогічні дії здійснюються і за ситуації, коли потрібно зберегти об'єкт&lt;br /&gt;
(тобто його стан) – перетворення в набір байт і подальша їх запис у файл. Зрозуміло, що&lt;br /&gt;
при відновленні даних в обох розглянутих випадках проробляються зворотні дії –&lt;br /&gt;
спочатку прочитується послідовність байт, а потім вона перетвориться в потрібний&lt;br /&gt;
формат.&lt;br /&gt;
&lt;br /&gt;
Класи InputStream і OutputStream&lt;br /&gt;
&lt;br /&gt;
InputStream – це базовий клас для потоків введення, тобто читання. Відповідно, він&lt;br /&gt;
описує базові методи для роботи з байтовими потоками даних. Ці методи необхідні всім&lt;br /&gt;
класам, які успадковуються отInputStream.&lt;br /&gt;
&lt;br /&gt;
Проста операція представлена методом read() (без аргументів). Він є абстрактним і,&lt;br /&gt;
відповідно, має бути визначений в класах-спадкоємцях. Цей метод призначений для&lt;br /&gt;
прочитування рівно одного байта із потоку, проте повертає при цьому значення типу int. В&lt;br /&gt;
тому випадку, якщо прочитування відбулося успішно, значення, що повертається, лежить&lt;br /&gt;
в діапазоні від 0 до 255 і є отриманим байтом (значення int має 4 байти і виходить простим&lt;br /&gt;
доповненням нулями в двійковому уявленні). Звернете увагу, що отриманий таким чином&lt;br /&gt;
байт не володіє знаком і не знаходиться в діапазоні від -128 до +127, як примітивний&lt;br /&gt;
тип byte в Java.&lt;br /&gt;
&lt;br /&gt;
Якщо досягнутий кінець потоку, тобто в нім більше немає інформації для читання, то&lt;br /&gt;
значення, що повертається, рівне -1.&lt;br /&gt;
&lt;br /&gt;
Якщо ж рахувати з потоку дані не вдається із-за якихось помилок, або збоїв, буде&lt;br /&gt;
кинуто виключення java.io.IOException. Цей клас успадковується від Exception, тобто його&lt;br /&gt;
завжди необхідно обробляти явно. Річ у тому, що канали передачі інформації, будь&lt;br /&gt;
то Internet або, наприклад, жорсткий диск, можуть давати збої незалежно від того,&lt;br /&gt;
наскільки добре написана програма. А це означає, що потрібно бути готовим до них, щоб&lt;br /&gt;
користувач не втратив потрібні дані.&lt;br /&gt;
&lt;br /&gt;
Метод read() – це абстрактний метод, але саме з дотриманням всіх вказаних умов він&lt;br /&gt;
має бути реалізований в класах-наслідниках.&lt;br /&gt;
&lt;br /&gt;
На практиці зазвичай доводиться прочитувати не один, а відразу декілька байт –&lt;br /&gt;
тобто масив байт. Для цього використовується метод read(), де як параметри передається&lt;br /&gt;
масив byte[]. При виконанні цього методу в циклі проводиться виклик абстрактного&lt;br /&gt;
методу read() (визначеного без параметрів) і результатами заповнюється переданий масив.&lt;br /&gt;
Кількість байт, яке прочитане таким чином, дорівнює довжині переданого масиву. Але&lt;br /&gt;
при цьому може так вийти, що дані в потоці закінчаться ще до того, як буде заповнений&lt;br /&gt;
весь масив. Тобто можлива ситуація, коли в потоці даних (байт) міститься менше, ніж&lt;br /&gt;
довжина масиву. Тому метод повертає значення int, яке вказує, скільки байт було реально&lt;br /&gt;
пораховано. Зрозуміло, що це значення може бути від 0 до величини довжини переданого&lt;br /&gt;
масиву.&lt;br /&gt;
&lt;br /&gt;
Якщо ж ми спочатку хочемо заповнити не весь масив, а тільки його частина, то для&lt;br /&gt;
цих цілей використовується метод read(), якому, окрім масиву byte[], передаються ще&lt;br /&gt;
два int значення. Перше – це позиція в масиві, з якою слід почати заповнення, друге, –&lt;br /&gt;
кількість байт, яке потрібно рахувати. Такий підхід, коли для отримання даних&lt;br /&gt;
передається масив і два int числа – offset (зсув) і length (довжина), є досить поширеним і&lt;br /&gt;
часто зустрічається не тільки в пакеті java.io.&lt;br /&gt;
&lt;br /&gt;
При виклику методів read() можливе виникнення такої ситуації, коли запрошувані&lt;br /&gt;
дані ще не готові до прочитування. Наприклад, якщо ми прочитуємо дані, що поступають&lt;br /&gt;
з мережі, і вони ще просто не прийшли. У такому разі не можна сказати, що даних більше&lt;br /&gt;
немає, але і вважати теж нічого - виконання зупиняється на виклику методу read() і&lt;br /&gt;
виходить &amp;quot;зависання&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Щоб дізнатися, скільки байт в потоці готово до прочитування, застосовується&lt;br /&gt;
метод available(). Цей метод повертає значення типу int, яке показує, скільки байт&lt;br /&gt;
в потоці готово до прочитування. При цьому не варто плутати кількість байт, готових до&lt;br /&gt;
прочитування, з тією кількістю байт, які взагалі можна буде рахувати з цього потоку.&lt;br /&gt;
&lt;br /&gt;
Метод available() повертає число – кількість байт, саме на даний момент готових до&lt;br /&gt;
прочитування.&lt;br /&gt;
&lt;br /&gt;
Коли робота з вхідним потоком даних закінчена, його слід закрити. Для цього&lt;br /&gt;
викликається метод close(). Цим викликом будуть звільнені всі системні ресурси, пов'язані&lt;br /&gt;
з потоком.&lt;br /&gt;
&lt;br /&gt;
Точно так, як і InputStream – це базовий клас для потоків введення,&lt;br /&gt;
клас OutputStream – це базовий клас для потоків виводу.&lt;br /&gt;
&lt;br /&gt;
У класі OutputStream аналогічним чином визначаються три методи write() – що один&lt;br /&gt;
приймає як параметр int, другий, – byte[] і третій – byte[], плюс два int-числа. Всі ці методи&lt;br /&gt;
нічого не повертають (void).&lt;br /&gt;
&lt;br /&gt;
Метод write(int) є абстрактним і має бути реалізований в класах-наслідниках. Цей&lt;br /&gt;
метод приймає як параметр int, але реально записує в потік тільки byte – молодші 8 битий&lt;br /&gt;
в двійковому уявленні. Останні 24 біта будуть проігноровані. У разі виникнення помилки&lt;br /&gt;
цей метод кидає java.io.IOException, як, втім, і більшість методів, пов'язаних з вводом-&lt;br /&gt;
виводом.&lt;br /&gt;
&lt;br /&gt;
Для запису в потік відразу деякої кількості байт методу write() передається масив&lt;br /&gt;
байт. Або, якщо ми хочемо записати тільки частину масиву, то передаємо масив byte[] і&lt;br /&gt;
два int-числа – відступ і кількість байт для запису. Зрозуміло, що якщо вказати невірні&lt;br /&gt;
параметри – наприклад, негативний відступ, негативна кількість байт для запису, або&lt;br /&gt;
якщо сума відступ плюс довжина буде більше довжини масиву, – у всіх цих випадках&lt;br /&gt;
кидається виключення IndexOutOfBoundsException.&lt;br /&gt;
&lt;br /&gt;
Реалізація потоку може бути такій, що дані записуються не відразу, а зберігаються&lt;br /&gt;
якийсь час в пам'яті. Наприклад, ми хочемо записати у файл якісь дані, які отримуємо&lt;br /&gt;
порціями по 10 байт, і так 200 разів підряд. У такому разі замість 200 звернень до файлу&lt;br /&gt;
зручніше буде скопити всі ці дані в пам'яті, а потім одним заходом записати все 2000 байт.&lt;br /&gt;
&lt;br /&gt;
Тобто клас вихідного потоку може використовувати деякий внутрішній механізм для&lt;br /&gt;
буферизації (тимчасового зберігання перед відправкою) даних. Щоб переконатися, що&lt;br /&gt;
дані записані в потік, а не зберігаються в буфері, викликається метод flush(), визначений&lt;br /&gt;
в OutputStream. У цьому класі його реалізація порожня, але якщо який-небудь із&lt;br /&gt;
спадкоємців використовує буферизацію даних, то цей метод має бути в нім&lt;br /&gt;
перевизначений.&lt;br /&gt;
&lt;br /&gt;
Коли робота з потоком закінчена, його слід закрити. Для цього викликається&lt;br /&gt;
метод close(). Цей метод спочатку звільняє буфер (викликом методу flush), після&lt;br /&gt;
чого потік закривається і звільняються всі пов'язані з ним системні ресурси.&lt;br /&gt;
Закритий потік не може виконувати операції виводу і не може бути відкритий наново. У&lt;br /&gt;
классеOutputStream реалізація методу close() не проводить ніяких дій.&lt;/div&gt;</summary>
		<author><name>V kotyak</name></author>	</entry>

	</feed>