• ,

com.javarush.task.task18.task1813

package com.javarush.task.task18.task1813;

import java.io.*;

/* 
AmigoOutputStream
*/

public class AmigoOutputStream extends FileOutputStream {
    public static String fileName = "D:/tmp/result.txt";
    private FileOutputStream original = null;


    public AmigoOutputStream(FileOutputStream fileOutputStream) throws Exception {
        super(fileOutputStream.getFD());
        this.original = fileOutputStream;
    }

    @Override
    public void write(int b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        original.write(b, off, len);
    }

    @Override
    public void close() throws IOException {
        original.flush();
        original.write("JavaRush © All rights reserved.".getBytes());
        original.close();
    }

    @Override
    public void flush() throws IOException {
        original.flush();
    }

    public static void main(String[] args) throws Exception {
        new AmigoOutputStream(new FileOutputStream(fileName));
    }

}

Вот такое решение получилось. После того как валидатор принял его, решил протестировать.
переписал метод main следующим образом:
AmigoOutputStream amigoOutputStream = new AmigoOutputStream(new FileOutputStream(fileName));
        amigoOutputStream.close();

Открываю выходной файл и вижу там:
JavaRush © All rights reserved.JavaRush © All rights reserved.

Строка записалась два (!) раза. Отладка показала что переопределенный метод close выполняется два раза…

До верного решения додумался сам заменив строку :
super(fileOutputStream.getFD());
на :
super(filename);
но у меня остались вопросы:
Что это за FileDescriptor, который возвращает метод getFD()?
Получается с его помощью нельзя инициализировать FileOutputStream?
И почему при таком вызове конструктора суперкласса метод close выполняется два раза?

1 комментарий

odium
Объект FileDescriptor служит для представления сущности, описывающей открытый файл и определяемой особенностями применяемой операционной системы. Объект дескриптора открытого файла может быть получен вызовом метода getFD объекта байтового потока File, но его нельзя определить для символьных потоков File. Также есть метод valid, проверяющий действителен ли объект FileDescriptor; дескрипторы, созданные непосредственно с помощью конструктора класса FileDescriptor без параметров, действительными не считаются.

Объект FileDescriptor может быть применен для создания нового потока File на основе того же файла, который используется другим потоком, — информация об имени и местоположении файла в данном случае не нужна.

Инициализировать то можно, но вот добавление строки…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.