Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Closing a Java FileInputStream

Alright, I have been doing the following (variable names have been changed):

 FileInputStream fis = null; try {     fis = new FileInputStream(file);      ... process ...  } catch (IOException e) {     ... handle error ... } finally {     if (fis != null)         fis.close(); }  

Recently, I started using FindBugs, which suggests that I am not properly closing streams. I decide to see if there's anything that can be done with a finally{} block, and then I see, oh yeah, close() can throw IOException. What are people supposed to do here? The Java libraries throw too many checked exceptions.

like image 380
Matt H Avatar asked Oct 01 '08 07:10

Matt H


People also ask

Do you need to close FileInputStream Java?

Yes, you need to close the inputstream if you want your system resources released back. FileInputStream. close() is what you need.

How do I close Java IO?

The java. io. FileOutputStream. close() closes this file output stream and releases any system resources associated with this stream.

Should I close FileOutputStream?

No. It is not require to close other components.

How do you clear a stream in Java?

The flush() method of PrintStream Class in Java is used to flush the stream. By flushing the stream, it means to clear the stream of any element that may be or maybe not inside the stream. It neither accepts any parameter nor returns any value.


2 Answers

For Java 7 and above try-with-resources should be used:

try (InputStream in = new FileInputStream(file)) {   // TODO: work } catch (IOException e) {   // TODO: handle error } 

If you're stuck on Java 6 or below...

This pattern avoids mucking around with null:

    try {         InputStream in = new FileInputStream(file);         try {             // TODO: work         } finally {             in.close();         }     } catch (IOException e) {         // TODO: error handling     } 

For a more detail on how to effectively deal with close, read this blog post: Java: how not to make a mess of stream handling. It has more sample code, more depth and covers the pitfalls of wrapping close in a catch block.

like image 79
McDowell Avatar answered Sep 30 '22 05:09

McDowell


Something like the following should do it, up to you whether you throw or swallow the IOException on attempting to close the stream.

FileInputStream fis = null; try {     fis = new FileInputStream(file);      ... process ...   } catch (IOException e) {     ... blah blah blah ... } finally {     try     {         if (fis != null)             fis.close();     }     catch (IOException e)     {     } } 
like image 24
Max Stewart Avatar answered Sep 30 '22 05:09

Max Stewart