テキストファイルでないファイルとは、文字として表示できないデータを含むファイルです。(これも突き詰めれば正確ではありません)バイナリーデータなどと呼ばれることがあります。バイナリとは0か1かというデータだという意味です。
ファイルのデータはどのファイルもデータがバイト単位で並んだものと考えることができます。1バイトとは情報の単位で256種類の状態を持ちます。これが数値を表すとは限らないのですが、正の整数と考えて0から255までの数として書き出すことができます。ここではこれをやってみることにします。
ファイルからバイト単位でデータを読み出すには、FileInputStream(ファイル名)を使います。
次のようにします。
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); } } }
javaでは連続したバイト単位のデータをバイトストリームといいます。これがファイルから流入するイメージで FileInputStream という名前がつきました。
new FileInputStream(ファイル名) でファイル名を引数として、ファイルからバイト単位でデータを読むためのオブジェクトが作成されます。それに、in という名前を付けています。ファイルの表紙を開いて中身を読む直前までの用意ができました。この後 in というオブジェクトを通してファイルを読みます。
このFileInputStreamも使い終わったらcloasをします。
ファイルからバイト単位で読むには、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) は e をそのまま表示するとどうなるかと入れてみたまでです。
このプログラムはテキストファイルでないデータも、テキストデータも、数値の並んだものとして表示します。
0 ~ 255 のデータは16進数にすると2桁で表示できるので、この手のデータは16進数で表示する習慣です。文字コード表などは16進数で書かれているのでこの方が便利です。
Dump も改良します。
次のようにします。
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バイト
Dump.java をつくり実行してみなさい
引数にjavaフォルダー内に存在するファイルを指定しないとうまくいきません。
41 が A, 6D が m と読む。
+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 |
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 謂 違 遺 医 井 亥 域 育 郁 磯 一 壱 溢 逸 稲 茨
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 稲 茨 芋 鰯 允 印 咽 員 因 姻 引 飲 淫 胤 蔭