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

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

テキストファイルでないファイルとは、文字として表示できないデータを含むファイルです。(これも突き詰めれば正確ではありません)バイナリーデータなどと呼ばれることがあります。バイナリとは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 を引数にすれば次のようになります。(当然この結果はtoi01.txtの内容により異なります)

$ java Dump toi01.txt
 28 31 29 20 69 6e 74 20 20 20 20 69 6e 74 20 20
 20 20 e2 97 8b e3 80 80 e2 97 8b  a 28 32 29 20
 69 6e 74 20 20 20 20 64 6f 75 62 6c 65 20 c3 97
 e3 80 80 c3 97  a 28 33 29 20 66 6c 6f 61 74 20
 20 64 6f 75 62 6c 65 20 c3 97 e3 80 80 c3 97  a
 28 34 29 20 66 6c 6f 61 74 20 20 69 6e 74 20 20
 20 20 c3 97 e3 80 80 e2 97 8b  a 28 35 29 20 64
 6f 75 62 6c 65 20 6c 6f 6e 67 20 20 20 c3 97 e3
 80 80 e2 97 8b  a 28 36 29 20 64 6f 75 62 6c 65
 20 64 6f 75 62 6c 65 20 e2 97 8b e3 80 80 e2 97
 8b  a
以上162バイト

課題

1.

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

ファイル名 Dump.java

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

文字コード

文字コードにはいくつかの種類があります。Linux上でエディタを使って保存した場合、指定がないとUTF-8という文字コードで保存されます(以前はEUC-JPでした)。WindowsではShift_JISになります。

ワープロで作られたファイルはテキストファイルではありません。

文字コードは普通16進数として表現されます。Shift_JISとUTF-8では00から7Fまでは共通で基本的な英数字と記号になります。日本語の文字は多バイト(Shift_JISでは2バイト、UTF-8では概ね3バイトで1文字になります。

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

この部分はShift_JISの場合もUTF-8の場合も共通です。

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

US-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

縦配置表

多バイト文字の文字コード

UTF-8(一部)はすぐ下。

Shift_JISの一部(このページの下部)

JISの一部(このページの下部)

UTF-8の一部

e38180行の+2列はe38182でこのコードは「あ」を表す、と読みます。

UTF-8の漢字部分は中国、韓国の漢字が統合されていますので、日本の文字以外は表示されない場合があります。

+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
c2a0NBSP¡¢£¤¥¦§¨©ª«¬SHY®¯
c2b0°±²³´µ·¸¹º»¼½¾¿
c380ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
c390ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
c3a0àáâãäåæçèéêëìíîï
c3b0ðñòóôõö÷øùúûüýþÿ
e296b0
e29780
e29790
e38180
e38190
e381a0
e381b0
e38280
e38290
e382a0
e382b0
e38380
e38390
e383a0
e383b0
e4b880
e4b890
e4b8a0
e4b8b0丿
e4b980
e4b990
e4b9a0
e4b9b0乿
e4ba80
e4ba90
e4baa0
e4bab0亿
e4bb80
e4bb90
e4bba0
e4bbb0仿
e4bc80
e4bc90
e4bca0
e4bcb0伿
e4bd80
e4bd90
e4bda0
e4bdb0使
e4be80
e4be90
e4bea0
e4beb0便
e4bf80
e4bf90
e4bfa0
e4bfb0俿
e58080倀
e58090
e580a0
e580b0

UTF-8の一部の最初へ

日本の文字の文字コード(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 謂 違 遺 医 井 亥 域 育 郁 磯 一 壱 溢 逸 稲 茨 

UTF-8の一部の最初へ

日本の文字の文字コード(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 稲 茨 芋 鰯 允 印 咽 員 因 姻 引 飲 淫 胤 蔭   

UTF-8の一部の最初へ

もくじ

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