Correct way to close nested streams and writers in Java [duplicate] Correct way to close nested streams and writers in Java [duplicate] java java

Correct way to close nested streams and writers in Java [duplicate]


When closing chained streams, you only need to close the outermost stream. Any errors will be propagated up the chain and be caught.

Refer to Java I/O Streams for details.

To address the issue

However, if flush() throws a runtime exception for some reason, then out.close() will never be called.

This isn't right. After you catch and ignore that exception, execution will pick back up after the catch block and the out.close() statement will be executed.

Your colleague makes a good point about the RuntimeException. If you absolutely need the stream to be closed, you can always try to close each one individually, from the outside in, stopping at the first exception.


In the Java 7 era, try-with-resources is certainly the way to go. As mentioned in several previous answers, the close request propagates from the outermost stream to the innermost stream. So a single close is all that is required.

try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f))) {  // do something with ois}

There is however a problem with this pattern. The try-with-resources is not aware of the inner FileInputStream, so if the ObjectInputStream constructor throws an exception, the FileInputStream is never closed (until the garbage collector gets to it). The solution is...

try (FileInputStream fis = new FileInputStream(f); ObjectInputStream ois = new ObjectInputStream(fis)) {  // do something with ois}

This is not as elegant, but is more robust. Whether this is actually a problem will depend on what exceptions can be thrown during construction of the outer object(s). ObjectInputStream can throw IOException which may well get handled by an application without terminating. Many stream classes only throw unchecked exceptions, which may well result in termination of the application.


It is a good practice to use Apache Commons to handle IO related objects.

In the finally clause use IOUtils

IOUtils.closeQuietly(bWriter);IOUtils.closeQuietly(oWritter);

Code snippet below.

BufferedWriter bWriter = null;OutputStreamWriter oWritter = null;try {  oWritter  = new OutputStreamWriter( httpConnection.getOutputStream(), "utf-8" );  bWriter = new BufferedWriter( oWritter );  bWriter.write( xml );}finally {  IOUtils.closeQuietly(bWriter);  IOUtils.closeQuietly(oWritter);}