JavaRush /Курси /Java Core /Потоки для введення/виведення файлів

Потоки для введення/виведення файлів

Java Core
Рівень 8 , Лекція 2
Відкрита

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

Для читань та запису файлів є два класи: 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);

— метод записує черговий байт, обрізаючи змінну 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();
}
— Дякую, Ріша. Зрештою зрозумів, як насправді працює цей код.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ