/*
Объединение файлов
Считать с консоли 2 имени файла.
В начало первого файла записать содержимое второго файла так, чтобы получилось объединение файлов.
Закрыть потоки.
*/
import java.io.*;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String file1 = "c:/1.txt";
String file2 = "c:/2.txt";
//
// String file1 = reader.readLine();
// String file2 = reader.readLine();
FileInputStream fileInputStream = new FileInputStream(file1);// сначала считываем первый файл
int file1Data = 0;
byte[] buffer1 = new byte[fileInputStream.available()];
while (fileInputStream.available() > 0) {
int data = fileInputStream.read(buffer1);
file1Data = data; // и записываем в како-то буффер
}
FileOutputStream fileOutputStream = new FileOutputStream(file1);// открыт поток для записи в 1 файл
FileInputStream fileInputStream2 = new FileInputStream(file2); // открыт поток для чтения 2 файл
while (fileInputStream2.available() > 0) {
int dt = fileInputStream2.read();
fileOutputStream.write(dt);
} // перекидываем данные из файла 2 в файл один
fileOutputStream.write(buffer1, 0, file1Data); //дописываем данные из буффера
fileInputStream2.close();
fileInputStream.close();
fileOutputStream.close();
}
}
Есть код, представленный выше, он рабочий и валидатор его принимает(если убрать комментарии сверху для чтения названия файлов из консоли). задача решена.
Однако я не до конца понимаю почему такое поведение.
При текущем коде результат правильный.
То есть мой файл 1.txt содержит текст "111"
Файл 2.txt содержит текст "222".
При выполнении кода в файле 1.txt результатом является текст "222111", что правильно.
Вопрос: почему происходит именно дописывание, а не замещение, ведь в FileOutputString не указан append ?
В последней строчке -- fileOutputStream.write(buffer1, 0, file1Data); мы как по идее замещаем содержимое при текущем исполнении метода.Andrii Gorshunov
41 уровень
Объединение файлов - почему такое поведение?
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Андрей Святогоров
16 декабря 2018, 15:58полезный
вообще, до закрытия потока чтения записи, как я понимаю, происходит примерно следующее, байты, которые должны быть записаны, представляют собой виртуальные изменения, то есть, так, словно ты сам внес изменения в файл, но не сохранил их, когда поток закрывается и уничтожается, а так со всеми не используемыми объектами, то жабамашина сохраняет измения в файле и в итоге мы имеем результат, если ты не закроешь поток в файле не появится ничего
+1
--------Master
16 декабря 2018, 14:43решение
Ты просто последовательно выполняешь несколько раз запись в один и тот же поток, поток при этом не закрывается и не открывается повторно, почему что-то должно замещаться? По этой логике и в цикле должен записываться только последний байт - для каждого байта вызывается fileOutputStream.write(dt), т.е. выполняются точно такие же последовательные записи новых значений.
+2
Andrii GorshunovExpert
16 декабря 2018, 16:14
То есть, если закрыть поток для записи и открыть его снова, он уже перезапишет все данные ( то есть сотрет существующие данные в файле и заместит своими данными?)
0
--------Master
16 декабря 2018, 16:16полезный
При открытии файла для записи без флага append содержимое файла обнуляется.
+1