テキストファイルでないファイルとは、文字として表示できないデータを含むファイルです。(これも突き詰めれば正確ではありません)バイナリーデータなどと呼ばれることがあります。バイナリとは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 を引数にすれば次のようになります。(当然この結果は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バイト
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文字になります。
この部分はShift_JISの場合もUTF-8の場合も共通です。
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 |
UTF-8(一部)はすぐ下。
e38180行の+2列はe38182でこのコードは「あ」を表す、と読みます。
UTF-8の漢字部分は中国、韓国の漢字が統合されていますので、日本の文字以外は表示されない場合があります。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c2a0 | NBSP | ¡ | ¢ | £ | ¤ | ¥ | ¦ | § | ¨ | © | ª | « | ¬ | 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 | 倰 | 倱 | 倲 | 倳 | 倴 | 倵 | 倶 | 倷 | 倸 | 倹 | 债 | 倻 | 值 | 倽 | 倾 | 倿 |
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 稲 茨 芋 鰯 允 印 咽 員 因 姻 引 飲 淫 胤 蔭