— А почнемо ми з потоків для введення/виведення файлів. Але про все по порядку.
Для читань та запису файлів є два класи: FileInputStream і FileOutputStream< /strong>. Як ти вже, напевно, здогадався, FileInputStream дозволяє послідовно читати з файлу байти, а FileOutputStream – записувати у файл байти. Ось які методи мають ці класи:
Метод | Що метод робить |
---|---|
|
— це конструктор. Дозволяє вказати ім'я файлу на диску, з якого створений об'єкт читатиме дані. |
|
— метод читає один байт із файлу і повертає його як результат. Тип результату розширюється до int. |
|
— метод повертає кількість непрочитаних (доступних) байт. |
|
— метод «закриває» потік, що викликається після закінчення роботи з потоком. Об'єкт виконує службові операції, пов'язані із закриттям файлу на диску тощо. З потоку більше не можна читати дані. |
Давай заради інтересу порахуємо суму всіх байт у файлі на диску. Ось як виглядатиме цей код:
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?
— Ок. Ось, дивись:
Метод | Що метод робить |
---|---|
|
— це конструктор. Дозволяє вказати ім'я файлу на диску, в який створений об'єкт писатиме дані. |
|
— метод записує черговий байт, обрізаючи змінну data до одного байта. |
|
— часто дані для запису спочатку збираються у великі блоки в пам'яті, а потім лише пишуться на диск. Команда flush вимагає негайно записати всю незбережену інформацію на диск. |
|
— метод «закриває» потік, що викликається після закінчення роботи з потоком. Об'єкт виконує службові операції, пов'язані із закриттям файлу на диску тощо. У потік більше не можна писати дані, 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();
}
— Дякую, Ріша. Зрештою зрозумів, як насправді працює цей код.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ