バイナリファイルから入力

テキストファイルでないファイル

テキストファイルでないファイルとは、文字として表示できないデータを含むファイルです。(これも突き詰めれば正確ではありません)バイナリーデータなどと呼ばれることがあります。バイナリとは0か1かというデータだという意味です。

ファイルのデータはどのファイルもデータがバイト単位で並んだものと考えることができます。1バイトとは情報の単位で256種類の状態を持ちます。これが数値を表すとは限らないのですが、正の整数と考えて0から255までの数として書き出すことができます。ここではこれをやってみることにします。

ファイルからバイト単位でデータを読み出すには、FileInputStream(ファイル名)を使います。

ファイル名 Dump.java

次のようにします。

import java.io.*;
public class Dump {
    public static void main(String[] args){
        String fname =args[0];
        int ct = 0;
        try {
            FileInputStream   in  = new FileInputStream(fname);
            int  b;
            ct = 0;
            while ((b = in.read()) != -1) {
                  System.out.print( b + " " );
                  if (ct % 16 == 15){
                     System.out.println();
                  }
                  ct++;
            }
            System.out.println();
            System.out.println("以上" + ct + "バイト");
            in.close();
        }
        catch (IOException e) {
            System.out.println( fname + " がないのでは?" );
            System.out.println( e);
        }
    }
}

FileInputStream

javaでは連続したバイト単位のデータをバイトストリームといいます。これがファイルから流入するイメージで FileInputStream という名前がつきました。

new FileInputStream(ファイル名) でファイル名を引数として、ファイルからバイト単位でデータを読むためのオブジェクトが作成されます。それに、in という名前を付けています。ファイルの表紙を開いて中身を読む直前までの用意ができました。この後 in というオブジェクトを通してファイルを読みます。

close

このFileInputStreamも使い終わったらcloasをします。

in.read()

ファイルからバイト単位で読むには、in.read() というメソッドを使います。バイト単位で読むのですが、読んだ値は int で帰ってきますので、int の変数を用意してそれに代入します。

int  b;
b = in.read();

もし、ファイルが最後まで読まれてしまった場合、in.read() は null ではなく、-1 を返します。これはもうファイルが空だというサインです。

ファイルが終わりまで読み込まれたときは b = in.read(); b の値が -1 になりますが、( b = in.read() ) の値も -1 になります。この便利な機能のおかげで、whileの(  )の中に、( b = in.read() ) != -1 とかけば「ファイルが空になっていないうち」という条件で繰り返されます。

もしこれができないときは

int  b;
b = in.read();
while( b != -1 ){
  ........
  b = in.read();
}

while のブロックの中で b をスペースで区切りながら数値として書き出しています。各データは 0 ~ 255 までの 256 種類です。

if の部分は、データを16個ごとに改行するために入れてあります。 10個でなく16個なのはコンピュータならではの習慣です。

System.err.println(e)

System.err.println(e) は e をそのまま表示するとどうなるかと入れてみたまでです。

実行

このプログラムはテキストファイルでないデータも、テキストデータも、数値の並んだものとして表示します。

16進で表示

0 ~ 255 のデータは16進数にすると2桁で表示できるので、この手のデータは16進数で表示する習慣です。文字コード表などは16進数で書かれているのでこの方が便利です。

Dump も改良します。

ファイル名 Dump.java

次のようにします。

import java.io.*;
public class Dump {
    public static void main(String[] args){
        String fname =args[0];
        int ct = 0;
        try {
            FileInputStream   in  = new FileInputStream(fname);
            int  b;
            ct = 0;
            while ((b = in.read()) != -1) {
                  System.out.printf( "%3s", Integer.toHexString(b));
                  if (ct % 16 == 15){
                     System.out.println();
                  }
                  ct++;
            }
            System.out.println();
            System.out.println("以上" + ct + "バイト");
            in.close();
        }
        catch (IOException e) {
            System.out.println( fname + " がないのでは?" );
            System.out.println( e);
        }
    }
}

どんなファイルでも表示できますが、テキストファイルなら、文字コードとの対応を読みとることができます。たとえば,toi01.txt を引数にすれば次のようになります。

$ java Dump toi01.txt
 28 31 29 20 69 6e 74 20 20 20 20 69 6e 74 20 20
 20 20 81 9b 81 40 81 9b  d  a 28 32 29 20 69 6e
 74 20 20 20 20 64 6f 75 62 6c 65 20 81 7e 81 40
 81 7e  d  a 28 33 29 20 66 6c 6f 61 74 20 20 64
 6f 75 62 6c 65 20 81 7e 81 40 81 7e  d  a 28 34
 29 20 66 6c 6f 61 74 20 20 69 6e 74 20 20 20 20
 81 7e 81 40 81 9b  d  a 28 35 29 20 64 6f 75 62
 6c 65 20 6c 6f 6e 67 20 20 20 81 7e 81 40 81 9b
  d  a 28 36 29 20 64 6f 75 62 6c 65 20 64 6f 75
 62 6c 65 20 81 9b 81 40 81 9b  d  a
 以上156バイト

課題

1.

Dump.java をつくり実行してみなさい

ファイル名 Dump.java

引数にjavaフォルダー内に存在するファイルを指定しないとうまくいきません。

文字コード

1バイト文字の文字コード(us-ascii)

41 が A, 6D が m と読む。

ASCIIコードの文字表
  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
20 SP ! " # $ % & ' ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~ DEL

縦配置表

日本の文字の文字コード(Shift-JIS の一部)

8190+A = 819A が ★ と読む

SJIS +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 
8190 $ ¢ £ % # & * @ § ☆ ★ ○ ● ◎ ◇ ◆ 
8240 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 0 
8250 1 2 3 4 5 6 7 8 9 ・ ・ ・ ・ ・ ・ ・ 
8260 A B C D E F G H I J K L M N O P 
8270 Q R S T U V W X Y Z ・ ・ ・ ・ ・   
8280 ・ a b c d e f g h i j k l m n o 
8290 p q r s t u v w x y z ・ ・ ・ ・ ぁ 
82A0 あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け 
82B0 げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち 
82C0 ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ 
82D0 ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め 
82E0 も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ 
82F0 を ん ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 
8340 ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ 
8350 ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ 
8360 チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ 
8370 パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ   
8380 ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ 
8390 ヰ ヱ ヲ ン ヴ ヵ ヶ ・ ・ ・ ・ ・ ・ ・ ・ 

SJIS +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 
8890 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 亜 
88A0 唖 娃 阿 哀 愛 挨 姶 逢 葵 茜 穐 悪 握 渥 旭 葦 
88B0 芦 鯵 梓 圧 斡 扱 宛 姐 虻 飴 絢 綾 鮎 或 粟 袷 
88C0 安 庵 按 暗 案 闇 鞍 杏 以 伊 位 依 偉 囲 夷 委 
88D0 威 尉 惟 意 慰 易 椅 為 畏 異 移 維 緯 胃 萎 衣 
88E0 謂 違 遺 医 井 亥 域 育 郁 磯 一 壱 溢 逸 稲 茨 

日本の文字の文字コード(JIS の一部)

2420+A = 242A が 「お」 と読む

JIS  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  
2420    ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く
2430 ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た
2440 だ ち ぢ っ つ づ て で と ど な に ぬ ね の は
2450 ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み
2460 む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ
2470 ゐ ゑ を ん

JIS  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  
2520    ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク
2530 グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ
2540 ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ
2550 バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ
2560 ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ
2570 ヰ ヱ ヲ ン ヴ ヵ ヶ 

JIS  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  
3020    亜 唖 娃 阿 哀 愛 挨 姶 逢 葵 茜 穐 悪 握 渥
3030 旭 葦 芦 鯵 梓 圧 斡 扱 宛 姐 虻 飴 絢 綾 鮎 或
3040 粟 袷 安 庵 按 暗 案 闇 鞍 杏 以 伊 位 依 偉 囲
3050 夷 委 威 尉 惟 意 慰 易 椅 為 畏 異 移 維 緯 胃
3060 萎 衣 謂 違 遺 医 井 亥 域 育 郁 磯 一 壱 溢 逸
3070 稲 茨 芋 鰯 允 印 咽 員 因 姻 引 飲 淫 胤 蔭   
もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified