web-dev-qa-db-fra.com

Comment vérifier si un OutputStream est fermé

Existe-t-il de toute façon pour vérifier si un OutputStream est fermé sans tenter d'écrire dessus et d'attraper le IOException?

Par exemple, considérez la méthode artificielle suivante:

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

Que pourriez-vous remplacer /* stream isn't closed */ avec?

28
chrisbunney

Le flux sous-jacent peut ne pas le savoir fermé jusqu'à ce que vous tentiez d'écrire dessus (par exemple, si l'autre extrémité d'un socket le ferme)

L'approche la plus simple consiste à l'utiliser et à gérer ce qui se passe s'il se ferme ensuite, plutôt que de le tester d'abord également.

Peu importe ce que vous testez, il y a toujours une chance d'obtenir une IOException, vous ne pouvez donc pas éviter le code de gestion des exceptions. L'ajout de ce test risque de compliquer le code.

32
Peter Lawrey

Malheureusement, l'API OutputStream n'a pas de méthode comme isClosed().

Donc, je ne connais qu'une seule façon claire: créez votre classe StatusKnowingOutputStream qui encapsule tout autre flux de sortie et implémente sa méthode close() comme suit:

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

Ajoutez maintenant la méthode isClosed()

public boolean isClosed() {
    return closed;
}
9
AlexR

Le OutputStream lui-même ne prend pas en charge une telle méthode. L'interface Closable est définie de telle manière qu'une fois que vous appelez close (), vous allez vous débarrasser de ce OutputStream.

Vous devriez peut-être revoir un peu la conception de l'application et vérifier pourquoi vous ne le faites pas et vous vous retrouvez avec une instance OutputStream fermée toujours en cours d'exécution dans votre application.

2
jbx
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;
}

Cela n'est possible que pour un FileOutputStream!

2
Joop Eggen

Non. Si vous implémentez la vôtre, vous pouvez écrire une méthode isClosed, mais si vous ne connaissez pas la classe concrète, alors non. OutputStream n'est qu'une classe abstraite. Voici sa mise en œuvre:

   /**
 * 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 {
}
1
Kylar