Задача решена, но понятно не все. Прошу прояснить некоторые моменты.
public static String fileName = "d:\\temp\\file2";
FileOutputStream component;
public AmigoOutputStream(FileOutputStream component) throws FileNotFoundException {
super(fileName);
this.component = component;
}
Вызываем конструктор родителя с аргументом fileName, потому что у родителя нет конструктора по умолчанию.
Этот конструктор создает под капотом объект типа File с "метаданными" fileName, если можно так сказать.
Вопрос 1: ссылку на объект типа File мы нигде не создаем, выходит у нас создается ненужный объект, который мы нигде не используем?
Потом в задании одно из требований - дописать текст в существующий файл при вызове метода close(), ок добавим функционал методу:
@Override
public void close() throws IOException {
String someText = "Тратата";
component.write(someText.getBytes());
component.close();
}
Теперь собственно пробую сделать эту дозапись:
new AmigoOutputStream(new FileOutputStream(fileName, true)).close;
Вопрос 2: Файл был затерт и записан со строкой "Тратата", вместо двух таких (одна уже была до начала записи). Почему не произошла дозапись?
Дозапись происходит только если добавить аргументы true в вызов конструктора родителя super(fileName, true), и при создании потока в мейне.
Вопрос 3: Где связь этого конструктора (super(...)) или же созданного им объекта типа File с нашим объектом component, делегирующим методы FileOutputStream?
Пример был бы на много понятнее, если бы наследовать нужно было бы OutputStream, тогда не пришлось бы вызывать конструктор родителя и создавать непонятного назначения без ссылки объект типа File.