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

Как проверить, закрыт ли OutputStream

В любом случае, чтобы проверить, закрыт ли OutputStream, не пытаясь записать его и поймав IOException?

Например, рассмотрим следующий надуманный метод:

public boolean isStreamClosed(OutputStream out){
    if( /* stream isn't closed */){
        return true;
    }else{
        return false;
    }
}

Что вы могли бы заменить /* stream isn't closed */ на?

4b9b3361

Ответ 1

Подтекающий поток может не знать его закрытым, пока вы не попытаетесь его написать (например, если другой конец сокета закрывает его)

Самый простой подход - использовать его и обрабатывать то, что происходит, если оно закрывается тогда, а не сначала тестировать его.

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

Ответ 2

К сожалению, у OutputStream API нет метода вроде isClosed().

Итак, я знаю только один понятный способ: создайте свой класс StatusKnowingOutputStream, который переносит любой другой выходной поток и реализует его метод close() следующим образом:

public void close() {
    out.close();
    closed = true;
}

Теперь добавьте метод isClosed()

public boolean isClosed() {
    return closed;
}

Ответ 3

Сам OutputStream не поддерживает такой метод. Интерфейс Closable определяется таким образом, что, как только вы вызываете close(), вы собираетесь избавиться от этого OutputStream.

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

Ответ 4

public boolean isStreamClosed(FileOutputStream out){
    try {
        FileChannel fc = out.getChannel();
        return fc.position() >= 0L; // This may throw a ClosedChannelException.
    } catch (java.nio.channels.ClosedChannelException cce) {
        return false;
    } catch (IOException e) {
    }
    return true;
}

Это возможно только для FileOutputStream!

Ответ 5

Нет. Если вы реализуете свои собственные, вы можете написать метод isClosed, но если вы не знаете конкретного класса, то нет. OutputStream - это всего лишь абстрактный класс. Здесь это реализация:

   /**
 * Closes this output stream and releases any system resources 
 * associated with this stream. The general contract of <code>close</code> 
 * is that it closes the output stream. A closed stream cannot perform 
 * output operations and cannot be reopened.
 * <p>
 * The <code>close</code> method of <code>OutputStream</code> does nothing.
 *
 * @exception  IOException  if an I/O error occurs.
 */
public void close() throws IOException {
}