— А почнемо ми з потоків для введення/виведення файлів. Але про все по порядку.

Для читань та запису файлів є два класи: FileInputStream і FileOutputStream< /strong>. Як ти вже, напевно, здогадався, FileInputStream дозволяє послідовно читати з файлу байти, а FileOutputStream – записувати у файл байти. Ось які методи мають ці класи:

Метод Що метод робить
FileInputStream(String fileName);
— це конструктор. Дозволяє вказати ім'я файлу на диску, з якого створений об'єкт читатиме дані.
int read();
— метод читає один байт із файлу і повертає його як результат. Тип результату розширюється до int.
int available();
— метод повертає кількість непрочитаних (доступних) байт.
void close();
— метод «закриває» потік, що викликається після закінчення роботи з потоком.
Об'єкт виконує службові операції, пов'язані із закриттям файлу на диску тощо.
З потоку більше не можна читати дані.

Давай заради інтересу порахуємо суму всіх байт у файлі на диску. Ось як виглядатиме цей код:

Підрахунок суми всіх байт файлу на диску
public static void main(String[] args) throws Exception
{
 //Створюємо об'єкт FileInputStream, прив'язаний до файлу "c:/data.txt".
 FileInputStream inputStream = новий FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //поки залишилися непрочитані байти
 {
  int data = inputStream.read(); //прочитати черговий байт
  sum + = data; //додати його до загальної суми
 }
inputStream.close(); // закриваємо потік

 System.out.println(sum); //Виводимо суму на екран.
}

— Ми вже раніше щось подібне розбирали. А як влаштований FileOutputStream?

— Ок. Ось, дивись:

Метод Що метод робить
FileOutputStream (String fileName);

— це конструктор. Дозволяє вказати ім'я файлу на диску, в який створений об'єкт писатиме дані.

void write(int data);< /code>

— метод записує черговий байт, обрізаючи змінну data до одного байта.

void flush();

— часто дані для запису спочатку збираються у великі блоки в пам'яті, а потім лише пишуться на диск.

Команда flush вимагає негайно записати всю незбережену інформацію на диск.

void close();

— метод «закриває» потік, що викликається після закінчення роботи з потоком.

Об'єкт виконує службові операції, пов'язані із закриттям файлу на диску тощо.

У потік більше не можна писати дані, flush при цьому викликається автоматично.

— І все?

— Так, тут практично лише один спосіб для запису – write, який записує лише один байт за раз. Але завдяки йому можна записати у файл скільки завгодно інформації.

Програмування – це процес розбиття одного великого та складного завдання на багато маленьких. Тут відбувається майже той самий процес: читання та запис великих даних невеликими порціями – по шматочках – по одному байти.

Ось як можна скопіювати файл на диску, користуючись цими класами:

Копіюємо файл на диску
public static void main(String[] args) throws Exception
{
 //Створюємо потік-читання-байт-з-файлу
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 // Створюємо потік-записи-байт-в-файл
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

 while (inputStream.available() > 0) //поки є ще непрочитані байти
 {
  int data = inputStream.read(); // прочитати черговий байт у змінну data
  outputStream.write(data); // і записати його на другий потік
 }

 inputStream.close(); //закриваємо обидва потоки. Вони більше не потрібні.
 outputStream.close();
}

— Дякую, Ріша. Зрештою зрозумів, як насправді працює цей код.