Подтвердить что ты не робот

Ли FileChannel.close() закрывает базовый поток?

Как и название; Закрывает ли закрывающий FileChannel основной поток файлов?


В документах API AbstractInterruptibleChannel.close() вы можете прочитать:

Закрывает этот канал.

Если канал уже закрыт, этот метод возвращает немедленно. В противном случае он отмечает канал как закрытый, а затем вызывает implCloseChannel, чтобы завершить операцию закрытия.

Что вызывает AbstractInterruptibleChannel.implCloseChannel:

Закрывает этот канал.

Этот метод вызывается методом close, чтобы выполнить фактическая работа по закрытию канала. Этот метод вызывается только в том случае, если канал еще не закрыт, и он никогда не вызывается больше, чем один раз.

Реализация этого метода должна предусматривать любой другой поток который заблокирован в операции ввода-вывода по этому каналу для возврата немедленно, либо выбросив исключение, либо, вернувшись нормально.

И это ничего не говорит о потоке. Так что, когда я это делаю:

public static void copyFile(File from, File to) 
        throws IOException, FileNotFoundException {

    FileChannel sc = null;
    FileChannel dc = null;

    try {
        to.createNewFile();

        sc = new FileInputStream(from).getChannel(); 
        dc = new FileOutputStream(to).getChannel();

        long pos = 0;
        long total = sc.size();
        while (pos < total)
            pos += dc.transferFrom(sc, pos, total - pos);

    } finally {
        if (sc != null) 
            sc.close();
        if (dc != null) 
            dc.close();
    }
}

... Я оставляю потоки открытыми?

4b9b3361

Ответ 1

Ответ "да", но в Javadoc ничего нет, что на самом деле так говорит. Причина в том, что FileChannel сам является абстрактным классом, а его конкретная реализация предоставляет метод implCloseChannel(), который закрывает базовый FD. Однако из-за этой архитектуры и того факта, что implCloseChannel() защищен, это не документируется.