Windows上で実行させるJava で、EUC_JP漢字コードが使えるLinuxシステム用のファイルを作ることが、
容易にできます。
Javaの文字列はUnicodeですが、byte列に変換する時、EUC_JPのキャラクタセットを使ってbyte列に変換し、
バイナリ保存すればよいのです。
(EUC_JPで、byte列にエンコードするgetBytesメソッドの例外処理が必要です。
キャラクタセットの説明は、←ここを確認ください。
以下に簡単なLinux用のファイルを作成するプログラムを示します。
import java.io.FileOutputStream; public class Test { public static void main(String[] arg) throws Exception { String str = "abc\r\n あいうえお\r\n 12345\r\n学校"; //EUCのファイル test.txtを作成 FileOutputStream fos = new FileOutputStream("test.txt"); byte[] a = str.getBytes("EUC_JP"); fos.write(a); fos.close(); } }
これで作成される"test.txt"の16進ダンプを示します。
0000 61 62 63 0D 0A A1 A1 A4 A2 A4 A4 A4 A6 A4 A8 A4 0010 AA 0D 0A 20 31 32 33 34 35 0D 0A B3 D8 B9 BB
作成したファイルをWindows用メモ帳で見ても
次のように正しく見えません。 |
世界中に存在するキャラクタセットの規則を知らないと作れません。
また、複数のバイト列を、少しずつ読み取って前方のbyteによって、
後方のbyte列を判断しなければならない場合があります。
つまり、バッファリング(部分的に処理対象を蓄えてから処理する)必要があるのです。
さて、Javaではbyte列のストリーム(情報の流れ)をバッファリングして、
文字単位で取り出す機能のクラスが用意されています。
それが、InputStreamReaderクラスです。
以下に、これを使って、このファイルをWindows上で表示するプログラムの例を示します。
import java.io.FileInputStream; import java.io.InputStreamReader; public class Test { public static void main(String[] arg) throws Exception { //EUCのファイル test.txtを読み込む FileInputStream fis = new FileInputStream("test.txt"); InputStreamReader isr = new InputStreamReader(fis, "EUC_JP"); int c; while ((c = isr.read()) != -1) {//1文字入力の繰り返し System.out.print((char)c);//文字にキャストして表示 } isr.close(); fis.close(); } } |
D:\java>java Test abc あいうえお 12345 学校 D:\java> |
InputStreamReaderクラスのコンストラクタは、
キャラクタセットと入力用バイト列ストリームを指定します。(これには例外処理が必要になります。)
後はクローズするまで、このオブジェクトに対するreadメソッドで、
一つの文字コードごとに取り出せます。(readは、ファイル終端後に実行すると-1が戻るので、そうでない繰り返しで終端まで読み取れます。)
このreadで得られたint型を、文字型に変換する必要がある場合は(char)のキャスト演算子を使います。
なお、ファイル入力用のbyteストリーム以外でも
InputStreamであればInputStreamReaderクラスコンストラクタの引数に使えます。
例えば、System.inを引数にしたコンストラクタを使えば、
標準入力のバイト列をバッファリングして、一つの文字コードごとに取り出せます。
なお、文字入力バッファリング用で、InputStreamReaderクラスがあるように、
文字出力バッファリング用にOutputStreamWriterクラスが用意されています。
このOutputStreamWriterクラスで、上記test.txtのファイルを作成する例を以下に示します。
import java.io.FileOutputStream; import java.io.OutputStreamWriter; public class Test { public static void main(String[] arg) throws Exception { //EUCのファイル test.txtを作成 FileOutputStream fos = new FileOutputStream("test.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos, "EUC_JP");//EUCエンコード String s = "abc\r\n"; osw.write(s); s = " あいうえお\r\n"; osw.write(s); s = " 12345\r\n"; osw.write(s); s = "学校"; osw.write(s); osw.close();//生成した順と逆の順で閉じる fos.close(); } }