Как проверить, закрыт ли OutputStream - PullRequest
28 голосов
/ 28 декабря 2011

Есть ли способ проверить, закрыт ли OutputStream, не пытаясь записать в него и перехватить IOException?

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

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

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

Ответы [ 6 ]

31 голосов
/ 28 декабря 2011

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

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

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

9 голосов
/ 28 декабря 2011

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

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

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

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

public boolean isClosed() {
    return closed;
}
2 голосов
/ 28 декабря 2011
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!

2 голосов
/ 28 декабря 2011

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

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

1 голос
/ 28 декабря 2011

Нет.Если вы реализуете свой собственный, вы можете написать метод 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 {
}
0 голосов
/ 14 августа 2013

с помощью out.checkError ()

while(!System.out.checkError()) {
    System.out.println('hi');
}

нашел его здесь: Как получить Java для выхода при передаче по голове

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...