However, you may see still see code that either doesn't use a modern JDK, or fails to take advantage of try-with-resources.
JDK < 7
Streams represent resources which you must always clean up explicitly,
by calling the close
method.
Some java.io
classes (apparently just the output classes)
include a flush
method. When a close
method
is called on a such a class, it automatically performs a flush
.
There is no need to explicitly call
flush
before calling close
.
One stream can be chained to another by passing it to the constructor of some second stream. When this second stream is closed, then it automatically closes the original underlying stream as well.
If multiple streams are chained together, then closing the one which
was the last to be constructed, and is thus at the highest level of abstraction,
will automatically close all the underlying streams. So, one only has to
call
close
on one stream in order to close (and flush, if applicable)
an entire series of related streams.
Example
import java.io.*; import java.util.*; import java.util.logging.*; /** JDK before version 7. */ public class ExerciseSerializable { public static void main(String... args) { //create a Serializable List List<String> quarks = Arrays.asList( "up", "down", "strange", "charm", "top", "bottom" ); //serialize the List //note the use of abstract base class references try{ //use buffering OutputStream file = new FileOutputStream("quarks.ser"); OutputStream buffer = new BufferedOutputStream(file); ObjectOutput output = new ObjectOutputStream(buffer); try{ output.writeObject(quarks); } finally{ output.close(); } } catch(IOException ex){ logger.log(Level.SEVERE, "Cannot perform output.", ex); } //deserialize the quarks.ser file //note the use of abstract base class references try{ //use buffering InputStream file = new FileInputStream("quarks.ser"); InputStream buffer = new BufferedInputStream(file); ObjectInput input = new ObjectInputStream (buffer); try{ //deserialize the List List<String> recoveredQuarks = (List<String>)input.readObject(); //display its data for(String quark: recoveredQuarks){ logger.info("Recovered Quark: " + quark); } } finally{ input.close(); } } catch(ClassNotFoundException ex){ logger.log(Level.SEVERE, "Cannot perform input. Class not found.", ex); } catch(IOException ex){ logger.log(Level.SEVERE, "Cannot perform input.", ex); } } // PRIVATE //Use Java's logging facilities to record exceptions. //The behavior of the logger can be configured through a //text file, or programmatically through the logging API. private static final Logger logger = Logger.getLogger(ExerciseSerializable.class.getPackage().getName()) ; }