前 目 次

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

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

テキストファイルでないファイルとは、文字として表示できないデータを含むファイルです。(これも突き詰めれば正確ではありません)バイナリーデータなどと呼ばれることがあります。バイナリとは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