Вы помните, чтобы закрыть выходные потоки?Ваш пример не перечисляет вызовы close (), которые также должны очищать потоки.Поведение BufferedWriter по умолчанию - очистить (записать) оставшееся содержимое перед закрытием потока, который он буферизует.
Возможно, вам следует добавить:
out1.close ();out2.close ();
Это очень распространенный случай, когда конец файла обрезается, когда вы забыли закрыть средство записи, использованное для его создания, особенно если вы использовали BufferedOutputStream или BufferedWriter.который не может очистить свой буфер (записать его в файл), пока он не будет явно очищен (или, чаще, закрыт).
Это очень хорошая привычка - сразу писать вызов close () после открытия потока, а затем писать весь код для работы с потоком между вызовами.Принимая во внимание исключения, стандартные вызовы используют следующую идиому:
Writer myOutWriter = null;
try {
myOutWriter = new BufferedWriter(new FileWriter("..."));
// Write to myOutWriter here
} catch (IOException ioe) {
// Handle any exceptions here
} finally {
try {
if (myOutWriter != null) {
myOutWriter.close();
}
} catch (IOException ioe) {
// Not much you can do here
}
}
Проект ввода-вывода Apache Commons (http://commons.apache.org/io/) имеет замечательную утилиту IOUtils.closeQuietly (), которая очищает блок finallyвключив try catch, null check и вызов close в один вызов метода. Пример использования этой библиотеки будет выглядеть так:
Writer myOutWriter = null;
try {
myOutWriter = new BufferedWriter(new FileWriter("..."));
// Write to myOutWriter here
} catch (IOException ioe) {
// Handle any exceptions here
} finally {
IOUtils.closeQuietly(myOutWriter);
}