Шаг 96.
Язык программирования Java.
Класс FileWriter

На этом шаге мы рассмотрим класс FileWriter

Этот класс создает поток вывода типа Writer для записи в файл. Ниже приведены наиболее употребительные конструкторы класса FileWriter.

FileWriter(String pathname);
FileWriter(String pathname, boolean isAppend);
FileWriter(File file);
FileWriter(File file, boolean isAppend);

Здесь параметр pathname обозначает имя полного пути к файлу, а параметр file – объект типа File, описывающий файл. Если параметр isAppend принимает логическое значение true, то выводимые данные присоединяются в конце файла. Все конструкторы данного класса могут сгенерировать исключение типа IOException.

Создание объекта типа FileWriter не зависит от того, существует ли файл. Когда создается объект типа FileWriter, то попутно создается и файл, прежде чем открыть его для вывода. Если же предпринимается попытка открыть файл, доступный только для чтения, то генерируется исключение типа IOException.


Для примера напишем программу, которая конкатенирует файлы. На вход программе передаются через командную строку имена файлов (не менее двух). На выходе программы будет результат конкатенации этих файлов. Результат программы должен быть в файле, переданный первый в командной строке.

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Пример использования класса FileWriter
 * */
public class Main {
    /*Список файлов для конкатенации*/
    private static List<File> files = new ArrayList<>();

    /**
     * Функция для проверки аргументов командной строки
     * @param args аргументы командной строки
     * @return true, если мы корректно передали неообходимые аргументы, 
     *                                                     и false в противном случае
     * */
    private static boolean checkArgs(String[] args) {
        /*Проверяем что программе переданны не менее двух файлов*/
        if (args.length < 2) {
            System.out.println("Введите не менее двух файлов");
            return false;
        }

        boolean isTrue = true;
        /*Проверяем наличие всех файлов на диске*/
        for (int i = 0; i < args.length; i++) {
            File file = new File(args[i]);
            if (!file.exists()) {
                System.out.println(args[i] + " не существует");
                isTrue = false;
            }
            files.add(file);
        }

        return isTrue;
    }

    public static void main(String[] args) {
        /*Проверяем аргументы командной строки*/
        if (checkArgs(args)) {
            /*Получаем файл, в который будем добавлять другие файлы*/
            File dest = files.get(0);
            /*Будем использовать try с ресурсами, чтобы корректно закрыть поток*/
            try (FileWriter fileWriter = new FileWriter(dest, true)) {
                char[] buffer = new char[1024];

                /*Просмотрим каждый файл*/
                for (int i = 1; i < files.size(); i++) {
                    File file = files.get(i);

                    /*
                      Будем читать каждый файл и записывать в конец первого файла 
                      все содержимое
                    */
                    try (FileReader fileReader = new FileReader(file)) {
                        int countChar = 0;
                        while ((countChar = fileReader.read(buffer)) != -1) {
                            fileWriter.write(buffer, 0, countChar);
                        }
                        fileWriter.flush();
                    } catch (IOException ignore) {}
                }
            } catch (IOException ignore) {}
            System.out.println("Файлы успешно сконкатенированы");
        }
    }
}

Проект можно взять здесь


Рис. 1. Вывод программы


На следующем шаге мы рассмотрим классы BufferedReader и BufferedWriter

Предыдущий шаг Содержание Следующий шаг