解答例 - j2.lesson09.TotalInBinaryFile

package j2.lesson09;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 課題2202 - 解答例.
 * バイナリファイル内に書かれた数値の合計を計算するプログラム.
 @author arakawa
 @version $Id: TotalInBinaryFile_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class TotalInBinaryFile {

    /**
     * バイナリファイル内に書かれた数値の合計を計算するプログラム.
     @param args 無視される
     @throws IOException 入出力中に例外が発生した場合
     @throws IllegalFileFormatException ファイルの形式が不正であった場合
     */
    public static void main(String[] argsthrows IOException, IllegalFileFormatException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        // print "ファイル名を入力:"
        System.out.print("ファイル名を入力:");
        // filename = コンソール入力 (String)
        String filename = reader.readLine();
        // file = filename のファイルを読み込み用に開く
        DataInputStream file;
        try {
            file = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
        }
        // if filename が開けない
        catch (FileNotFoundException e) {
            // print filename + "が開けませんでした。", 改行
            System.out.println(filename + "が開けませんでした。");
            // プログラムを終了
            return;
        }
        try {
            // total = 各数値の合計
            double total = 0.0;
            while (true) {
                int code = file.read();
                if (code == -1) {
                    break;
                }
                // code = 1 -> int
                else if (code == 1) {
                    total += file.readInt();
                }
                // code = 2 -> double
                else if (code == 2) {
                    total += file.readDouble();
                }
                // if 形式を表す値が 1 でも 2 でもない
                else {
                    // throw IllegalFileFormatException
                    throw new IllegalFileFormatException("不明なコード");
                }
            }
            // if ファイル読み込み中に例外が発生しなかった
            // print "合計は" + total
            System.out.println("合計は" + total);
        }
        // if データを読み込んでいる途中でファイルの終端に達した
        catch (EOFException e) {
            // throw IllegalFileFormatException
            throw new IllegalFileFormatException("不正なファイルの終端");
        }
        finally {
            file.close();
        }
    }
}