Як записати в файл Java

Запис даних у файл є одним з ключових завдань, з якими зіштовхуються розробники під час роботи з програмами. Це може включати зберігання налаштувань програми, логів, звітів, статистичних даних, результатів обчислень, обмін даними між різними частинами програми або навіть між різними програмами. Важливість запису даних у файл зростає, коли програма має працювати з великими обсягами інформації або коли необхідно забезпечити стійкість даних у разі відключення живлення чи аварійного завершення роботи програми.

На наших курсах Java розробки ми розглядаємо багато практичних ситуацій. В цій статті також покажемо на прикладах як можна використовувати класи та методи запису в файл.

У Java існує кілька способів запису даних у файли, які підходять для різних ситуацій та вимог. У цій статті ми розглянемо детально різні методи та класи, які можна використовувати для запису даних у файли, такі як FileWriter, FileOutputStream, BufferedWriter, метод WriteString(), PrintWriter, DataOutputStream та FileChannel. Кожен з цих підходів має свої особливості та переваги, тому детальне вивчення цих методів допоможе вам обрати найбільш оптимальний варіант для вашого конкретного завдання.

Клас FileWriter

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


import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("filewriter_example.txt");
            writer.write("Це приклад запису в файл за допомогою класу FileWriter.");
            writer.close();
        } catch (IOException e) {
            System.out.println("Помилка запису в файл: " + e.getMessage());
        }
    }
}

У цьому прикладі ми використовуємо клас FileWriter, який є класом для запису символьних даних в файл. Спочатку ми створюємо об’єкт FileWriter, вказавши шлях до файлу. Потім ми використовуємо метод write() для запису рядка у файл. На завершення, використовуємо метод close() для закриття потоку запису.

Клас FileOutputStream

Клас FileOutputStream може використовуватися для запису байтів в файл. Ось приклад запису тексту в файл за допомогою FileOutputStream:

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
    public static void main(String[] args) {
        try {
            FileOutputStream fos = new FileOutputStream("fileoutputstream_example.txt");
            String text = "Це приклад запису в файл за допомогою класу FileOutputStream.";
            byte[] textBytes = text.getBytes();
            fos.write(textBytes);
            fos.close();
        } catch (IOException e) {
            System.out.println("Помилка запису в файл: " + e.getMessage());
        }
    }
}

У прикладі з класом FileOutputStream ми записуємо байти в файл. Створюємо об’єкт FileOutputStream, вказавши шлях до файлу. Використовуємо метод write() для запису байтів (перетворивши рядок на масив байтів за допомогою методу getBytes()). Закриваємо потік запису, викликавши метод close().

Клас BufferedWriter

За допомогою класу BufferedWriter ми можемо записувати текст в файл, використовуючи буфер. Це забезпечує більш ефективний запис:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("bufferedwriter_example.txt"));
            writer.write("Це приклад записув файл за допомогою класу BufferedWriter.");
            writer.newLine();
            writer.write("Цей метод використовує буфер, що робить запис ефективнішим.");
            writer.close();
          } catch (IOException e) {
            System.out.println("Помилка запису в файл: " + e.getMessage());
            }
          }
}

Використовуючи клас BufferedWriter, ми створюємо буфер для запису символьних даних в файл. Створюємо об’єкт BufferedWriter, передаючи йому об’єкт FileWriter. Використовуємо метод write() для запису рядка у файл, а потім newLine() для додавання нового рядка. На завершення, закриваємо потік запису за допомогою методу close().

Метод WriteString()

У Java 11 було введено метод writeString(), який дозволяє записувати рядки в файл безпосередньо. Ось приклад його використання:


import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class WriteStringExample {
    public static void main(String[] args) {
        try {
            String text = "Це приклад запису в файл за допомогою методу writeString().";
            Files.writeString(Path.of("writestring_example.txt"), text);
        } catch (IOException e) {
            System.out.println("Помилка запису в файл: " + e.getMessage());
        }
    }
}

У цьому прикладі використовуємо статичний метод writeString() класу Files з Java 11. Цей метод дозволяє записувати рядки в файл без створення додаткових об’єктів. Метод приймає два аргументи: шлях до файлу та рядок, який необхідно записати.

Клас PrintWriter

Клас PrintWriter дозволяє записувати текст в файл з можливістю автоматичного пропуску рядка:


import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterExample {
    public static void main(String[] args) {
        try {
            PrintWriter writer = new PrintWriter(new FileWriter("printwriter_example.txt"));
            writer.println("Це приклад запису в файл за допомогою класу PrintWriter.");
            writer.println("Цей клас дозволяє записувати текст з автоматичним пропуском рядка.");
            writer.close();
        } catch (IOException e) {
            System.out.println("Помилка запису в файл: " + e.getMessage());
        }
    }
}

Використовуючи клас PrintWriter, ми можемо записувати форматований текст в файл. Створюємо об’єкт PrintWriter, передаючи йому об’єкт FileWriter. Використовуємо метод printf() для запису форматованого рядка в файл. На завершення, закриваємо потік запису за допомогою методу close().

Клас DataOutputStream

Клас DataOutputStream дозволяє записувати примітивні типи даних та рядки в файл:


import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputStreamExample {
    public static void main(String[] args) {
        try {
            DataOutputStream dos = new DataOutputStream(new FileOutputStream("dataoutputstream_example.txt"));
            dos.writeInt(42);
            dos.writeDouble(3.14);
            dos.writeUTF("Це приклад запису в файл за допомогою класу DataOutputStream.");
            dos.close();
        } catch (IOException e) {
            System.out.println("Помилка запису в файл: " + e.getMessage());
        }
    }
}


У прикладі з класом DataOutputStream ми записуємо примітивні типи даних та рядки в бінарний формат. Створюємо об’єкт DataOutputStream, передаючи йому об’єкт FileOutputStream. Використовуємо методи writeInt(), writeDouble() та writeUTF() для запису різних типів даних у файл. На завершення, закриваємо потік запису за допомогою методу close().

Клас FileChannel

Клас FileChannel дозволяє записувати дані в Java файл за допомогою каналів NIO.

Канали NIO (New I/O або Non-blocking I/O) – це альтернативний підхід до введення-виведення (I/O) в Java, який був введений у JDK 1.4. Вони дозволяють робити неблокуюче введення-виведення, тобто програма може продовжувати виконання інших завдань, поки операція введення-виведення відбувається. Це може допомогти підвищити продуктивність програм, особливо коли йдеться про мережеве введення-виведення або роботу з великими файлами.

Канали NIO в Java реалізовані за допомогою класу FileChannel. Вони дозволяють забезпечити більш низькорівневий та гнучкий контроль над операціями введення-виведення, а також надають можливість використання додаткових оптимізацій, таких як мапування файлів у пам’ять і передача даних між каналами напряму (наприклад, між мережевими сокетами або різними файлами).

Основна відмінність між стандартними I/O потоками та каналами NIO полягає у тому, що канали NIO використовують буфери для зберігання даних, в той час як стандартні потоки працюють з потоками байтів або символів безпосередньо. Це дозволяє реалізувати більш ефективний та контрольований обмін даними між каналами та джерелами даних.


import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelExample {
    public static void main(String[] args) {
        try {
            FileOutputStream fos = new FileOutputStream("filechannel_example.txt");
            FileChannel channel = fos.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(64);
            String text = "Це приклад запису в файл за допомогою класу FileChannel.";
            buffer.put(text.getBytes());
            buffer.flip();
            channel.write(buffer);
            channel.close();
            fos.close();
            } 
            catch (IOException e) {
          System.out.println("Помилка запису в файл: " + e.getMessage());
    }
}


У прикладі з класом FileChannel ми використовуємо канали вводу-виводу для запису даних у файл. Створюємо об’єкт FileChannel, відкривши файл на запис за допомогою методу FileChannel.open(). Використовуємо метод write() для запису байтів в файл (створюючи буфер за допомогою методу ByteBuffer.wrap()). Закриваємо канал запису, викликавши метод close().

Висновки

Ми розглянули різні способи запису в файл в Java, використовуючи різні класи та методи. Усі ці методи мають свої переваги та недоліки, тому вибір конкретного методу залежить від ваших потреб та обставин. Зазвичай, для запису текстових файлів використовуються класи FileWriter, BufferedWriter або PrintWriter. Якщо вам потрібно записувати бінарні дані, можете використовувати класи FileOutputStream, DataOutputStream або FileChannel. У Java 11 також є простий та зручний метод writeString(), який дозволяє записувати рядки безпосередньо в файл.

Після того, як ви ознайомились з цими методами, можна обрати найбільш підходящий для вашого проекту та ефективно записувати дані в файли.

Site Footer