Почему не идёт запись в файл?

219
02 марта 2017, 23:05
ArrayList<File> vuhod = new ArrayList<>();
//Коллекция vuhod заполнена файлами
File res1 = new File("D:\\allFilesContent.txt"); 
//Файл res1 (который точно существует) для записи того, что мы считаем из каждого файла vuhod
BufferedWriter writer = new BufferedWriter(new FileWriter(res1));
for (int i = 0; i < vuhod.size(); i++)
{
    BufferedReader reader = new BufferedReader(new FileReader(vuhod.get(i)));
    while (reader.ready())
    {
        writer.write(reader.readLine());
    }
    if (i == vuhod.size() - 1) {
    } else {
        writer.write('\r');
        writer.write('\n');
    }

Почему не заполняется файл, и что значат строки writer.write('\r'); и writer.write('\n');?

Answer 1

Запись в файл не идёт, так как вы не вызываете метод flush у writer.

BufferedWriter пишет данные в свой буфер (размер по умолчанию которого равен 8192 символам) и в выходной поток (FileWriter) отправляет данные из буфера только при его заполнении или при вызове flush() или close().

Также стоит закрывать за собой потоки чтения и записи. Для это удобно использовать конструкцию try-with-resources. Вызов метода close у BufferedWriter, кстати, приводит к отправке данных из буфера в выходной поток, так что в этом случае вызывать метод flush вручную не придётся.

В итоге код выглядит так:

List<File> vuhod = Arrays.asList(new File("in1.txt"), new File("in2.txt"));
File res1 = new File("out.txt");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(res1)))
{
    for (int i = 0; i < vuhod.size(); i++)
    {
        try (BufferedReader reader = new BufferedReader(new FileReader(vuhod.get(i))))
        {
            while (reader.ready())
            {
                writer.write(reader.readLine());
            }
            if (i < vuhod.size() - 1)
            {
                writer.write('\r');
                writer.write('\n');
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
catch (IOException e)
{
    e.printStackTrace();
}
Answer 2

у меня работает так:

public static void main(String[] args) throws IOException {
    String path = "E:\\MyProjects\\StackO\\questions\\634328";
    List<File> files = new ArrayList<>();
    files.add(new File(path + "\\1.txt")) ;
    files.add(new File(path + "\\2.txt")) ;
    files.add(new File(path + "\\3.txt")) ;
    files.add(new File(path + "\\4.txt")) ;

BufferedWriter writer = new BufferedWriter(new FileWriter(path + "\\ConcatFile.txt"));
for(File file: files){
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line;
    while ((line=reader.readLine()) != null){
        writer.write(line);
    }
    reader.close();
}
writer.close();
}

Это если очень уж надо на чистом io

READ ALSO
Отображение BLOB в Vaadin Grid

Отображение BLOB в Vaadin Grid

Приветствую! Ситуация такая - есть БД Оракл, в нем таблица Worker, в ней фото рабочих в формате BLOBНеофходимо отобразить в Vaadin Grid вместе с остальными...

354
Ошибка java.lang.IllegalArgumentException: No view found for id

Ошибка java.lang.IllegalArgumentException: No view found for id

Есть три страницы наследованные от Fragment

830
Создание класса для XML-структуры

Создание класса для XML-структуры

Мне необходимо взаимодействовать с REST сервисом, который отдает ответы в XMLСтруктура XML-документа такая:

282
Векторный город с помощью элементов

Векторный город с помощью элементов

Сделал векторную картинку с помощью элементов htmlНо почему то, когда я меняю высоту окна, она странно реагирует и всё сжимается, хотя должно...

307