解答例 - j2.lesson09.BinaryCopier

package j2.lesson09;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 課題2201 - 解答例.
 * ファイルを別のファイルにコピーするプログラム.
 @author arakawa
 @version $Id: BinaryCopier_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class BinaryCopier {
    /**
     * (バイナリ)ファイルを別のファイルにコピーするプログラム.
     @param args 無視される
     @throws IOException コンソール入力中に例外が発生した場合
     */
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        // print "コピー元のファイル名を入力:"
        System.out.print("コピー元のファイル名を入力:");
        // src = コンソール入力 (String)
        String src = reader.readLine();
        // print "コピー先のファイル名を入力:"
        System.out.print("コピー先のファイル名を入力:");
        // dst = コンソール入力 (String)
        String dst = reader.readLine();
        try {
            // copy(src, dst)
            copy(src, dst);
            // if コピー中に例外が発生しなかった
            // print src + "から" + dst + "にコピーしました。", 改行
            System.out.println(src + "から" + dst + "にコピーしました。");
        }
        // else
        catch (IOException e) {
            // print src + "から" + dst + "にコピーできませんでした。", 改行
            System.out.println(src + "から" + dst + "にコピーできませんでした。");
        }
    }
    
    /**
     <code>src</code>から<code>dst</code>にファイルの内容をコピーする。
     * このメソッド内で例外 {@link java.io.FileNotFoundException},
     {@link java.io.IOException} が発生した場合は、ここで捕捉せずに呼び出し元に通知される。
     @param src コピー元のファイル名
     @param dst コピー先のファイル名
     @throws IOException コピーしようとした際に例外が発生した場合
     */
    // copy(src, dst)
    public static void copy(String src, String dstthrows IOException {
        // in = src ファイルを読み込むために開く
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
        try {
            // out = src ファイルを書き込むために開く
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst));
            try {
                // in から out へ内容をコピーする
                while (true) {
                    int c = in.read();
                    if (c == -1) {
                        break;
                    }
                    out.write(c);
                }
                // // こちらのほうが速い?
                // byte[] buf = new byte[256];
                // while (true) {
                //     int len = in.read(buf);
                //     if (len == -1) {
                //         break;
                //     }
                //     out.write(buf, 0, len);
                // }
            }
            finally {
                out.close();
            }
        }
        finally {
            in.close();
        }
    }
}