public class AmigoOutputStream extends FileOutputStream {
public static String fileName = "/home/vladimir/Downloads/file1";
private FileOutputStream file;
public AmigoOutputStream (FileOutputStream file) throws IOException {
super(fileName);
this.file = file;
// this.file = file;
}
@Override
public void close() throws IOException {
flush();
// System.out.println("ddd");
String str = "JavaRush © All rights reserved.";
write(str.getBytes());
file.close();
}
@Override
public void flush () throws IOException {
file.flush();
}
public static void main(String[] args) throws IOException {
// new AmigoOutputStream(new FileOutputStream(fileName));
FileOutputStream dd = new AmigoOutputStream(new FileOutputStream(fileName,true));
dd.close();
}
}
У нас создается два обьекта: AmigoOutputStream (dd) и FileOutputStream которые работают с одним файлом. FileOutputStream имеет возможность дописывать в конец файла, AmigoOutputStream - нет.
Т.к AmigoOutputStream работает с обьектом FileOutputStream, то возник вопрос: почему фактически работая с FileOutputStream, при вызове AmigoOutputStream.close() запись в конец файла не происходит? После выполнения FileOutputStream.close () в объекте AmigoOutputStream происходит "какая-то магия", которая влияет на закрытие потока и происходит перезапись, а не добавление ?Владимир
19 уровень
Дописать в конец файла
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Виктор
26 мая 2022, 09:13
"AmigoOutputStream (dd) и FileOutputStream которые работают с одним файлом. FileOutputStream имеет возможность дописывать в конец файла, AmigoOutputStream - нет." - почему это?
вот здесь
Здесь вы создаваемому объекту AmigoOutputStream передаете ссылку на new FileOutputStream(fileName,true).
Есть, правда, еще вот это "super(fileName);" - но это не считается. Вообще по этому суперу в данной задаче есть обсуждения в вопросах у других людей.
0
Владимир
27 мая 2022, 03:00
Верно, передаю.
Но почему вызывая методы FileOutputStream через AmigoOutputStream, файл не дописывается ?
0
Владимир
27 мая 2022, 03:03
у нас есть два обьета , работающие с одним файлом. Мы дергаем методы AmigoOutputStream, которые делегируют исполнение в FileOutputStream. Т.е с файлом работает FileOutputStream. FileOutputStream должен дописывать в конец( в конструкторе передан параметр ), но этого не происходит.
0
Виктор
27 мая 2022, 10:20
Потратил кучу времени, но разобрался ) и Даже написал тут ход своих мысле, не всегда верных, потому удалил ).
Итак, корень зла вот здесь:
В вашем случае вы используете один и тот же файл несколько раз.
0
Виктор
27 мая 2022, 10:20решение
Как же с этим бороться? Ну вот такие варианты мне приходят на ум:
1) В конструктор AmigoOutputStream передавать какой-то "левый" файл. И пользоваться конструкцией
AmigoOutputStream amigoOutputStream = new AmigoOutputStream(new FileOutputStream(fileName, true));
2) Использовать вот такую конструкцию
Второй вариант предпочтительнее поскольку он уже не завязан на пути. Ведь с первым могут возникнуть проблемы на разных ФС
+2
Владимир
30 мая 2022, 05:15
Спасибо большое! .Не догадался, что AmigoOutputStream создастся с append = false.
По идеи это два разных класса использующие разные файловые дескрипторы ?
Или дескриптор один на конкретный файл для двух объектов ?
0
Виктор
30 мая 2022, 12:29
У вас вот здесь проблема "super(fileName);"
когда выполняется эта конструкция, у вас append для файла устанавливается в false. Далее передается всё это в конструктор FileOutputStream(File file, boolean append).
Там append используется вот здесь: open(name, append); потом вот здесь: open0(name, append); Как работает open0 мы уже не знаем, но учитывая то, что файловый дескриптор описан как финал он всё-таки одинаковый, а вы уже оперируете возможностями записи или дозаписи на уровне write(int b, boolean append). А тут уже у вас два объекта. Но append общий, он установлен для файла.
Для большего понимания проблемы надо копать уже не в сторону программирования,а в сторону работы ОС в общем и работы с файлами в частности. Ведь признак возможности записи в файл определяется не только вашей программой.
Если вопрос закрыт, то предлагаю поставить "решение" )
+1
Владимир
31 мая 2022, 05:49
Cпасибо
0
hidden #2513091
25 мая 2022, 04:03
Вот тут создается объект AmigoOutputStream у которого метод close() переопределен.
строка
идентична
для создания объекта FileOutputStream нужно писать так
0
Владимир
25 мая 2022, 04:22
Вопрос в другом: зачем в AmigoOutputStream необходимо передавать в конструктор append . Ведь он есть в FileOutputStream , с которым мы фактически работаем
0
Владимир
25 мая 2022, 04:39
Если в AmigoOutputStream не передавать append и указать другой файл ( с которым не работает FileOutputStream) , то запись в конец файла сработает
Получается AmigoOutputStream.сlose() помимо методов FileOutputStream выполняет что-то еще...
0