Java/Language Basics/finally
Close stream in finally
<source lang="java">
/*
* Copyright (c) 2004 David Flanagan. All rights reserved. * This code is from the book Java Examples in a Nutshell, 3nd Edition. * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied. * You may study, use, and modify it for any non-commercial purpose, * including teaching and use in open-source projects. * You may distribute it non-commercially as long as you retain this notice. * For a commercial use license, or to purchase the book, * please visit http://www.davidflanagan.ru/javaexamples3. */
//package je3.nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; /**
* FileCopy2.java: this program copies the file named in its first argument to * the file named in its second argument, or to standard output if there is no * second argument. */
public class FileCopy2 {
public static void main(String[] args) { FileInputStream fin = null; // Streams to the two files. FileOutputStream fout = null; // These are closed in the finally block. try { // Open a stream to for the input file and get a channel from it fin = new FileInputStream(args[0]); FileChannel in = fin.getChannel(); // Now get the output channel WritableByteChannel out; if (args.length > 1) { // If there is a second filename fout = new FileOutputStream(args[1]); // open file stream out = fout.getChannel(); // get its channel } else { // There is no destination filename out = Channels.newChannel(System.out); // wrap stdout stream } // Query the size of the input file long numbytes = in.size(); // Bulk-transfer all bytes from one channel to the other. // This is a special feature of FileChannel channels. // See also FileChannel.transferFrom() in.transferTo(0, numbytes, out); } catch (IOException e) { // IOExceptions usually have useful informative messages. // Display the message if anything goes wrong. System.out.println(e); } finally { // Always close input and output streams. Doing this closes // the channels associated with them as well. try { if (fin != null) fin.close(); if (fout != null) fout.close(); } catch (IOException e) { } } }
}
</source>
Test case for finally, to show its effect with return or exit
<source lang="java">
/*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002. * All rights reserved. Software written by Ian F. Darwin and others. * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee * cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s, * pioneering role in inventing and promulgating (and standardizing) the Java * language and environment is gratefully acknowledged. * * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for * inventing predecessor languages C and C++ is also gratefully acknowledged. */
/** Test case for "finally", to show its effect with
* return or exit. */
public class Finally {
/** Main method, does the work of the testing... */ public static void main(String[] argv) { try { throw new Exception(); } catch (Exception e) { System.out.println("Caught Exception"); return; // with return, Goodbye appears // System.exit(1); // with exit, Goodbye does not appear } finally { System.out.println("Goodbye!"); } }
}
</source>