Java:文字コード変換ツールを作る(1)文字コード変換
JavaのStringクラスは文字コード変換機能を備えています。今回はこの機能を使って,ファイルから読み込んだテキストを文字コード変換して新規テキストファイルに出力するプログラムを作ってみます。
変換する文字コードは,とりあえず「MS932」(Shift_JIS)から「UTF-8」への変換にしました。
加えて「テキストを行単位で読み込んで変換し,出力時に各行の終わりに改行を出力する」ことで,改行コードを揃える機能をもたせます。改行コードはCRLFを出力します。
■Stringクラスの文字コード変換
Stringクラスの文字列を,文字コードを指定して取り出すのは以下のようなコードになります。
String str = "文字列"; byte[] utf8bytes = str.getBytes("utf-8"); |
改行について,JavaにおけるCRLFの文字列表現は「"\r\n"」です。(「\」はバックスラッシュ)
これより,CRLFのバイト列は以下のように取得します。
byte[] CRLF = "\r\n".getBytes("utf-8"); |
改行コードは固定なので,クラス変数で定義しても良いかと思います。しかしながら,クラス変数として以下のように書くと,コンパイルエラーになってしまいます。
private static final byte[] CRLF = "\r\n".getBytes("utf-8"); |
※例外に対する処理は,文字コード指定が固定なので特に行いません。
private static final byte[] CRLF; static { try { CRLF = "\r\n".getBytes("utf-8"); } catch (UnsupportedEncodingException ex) {} } |
■ファイルからテキスト入力
テキストファイルから文字コードを指定してテキストを読み込む処理は以下のようになります。
Javaでのテキスト入力処理としてはポピュラーなものかと思います。
ここで入力ファイルの文字コードは「MS932」を指定しています。
File infile = new File(入力テキストファイルのパス表現); FileInputStream finst = null; InputStreamReader reader = null; BufferedReader in = null; try { finst = new FileInputStream(infile); reader = new InputStreamReader(finst, "MS932"); in = new BufferedReader(reader); String line; while ((line = in.readLine()) != null) { // 1行ごとの入力テキスト(=line)に対する処理をここで行う. } } finally { try { if (in != null) { in.close(); } } catch (IOException ex) {} } |
注:ここでは例外をcatchしません。例外が発生したときは,finallyで後始末をしたあとで,呼び出し元で例外をcatchすることとします。
■バイト列データをファイルに出力
変換したbyte配列をファイルに書き出す処理は以下のようになります。
File outfile = new File(出力テキストファイルのパス表現); FileOutputStream foutst = null; BufferedOutputStream out = null; try { foutst = new FileOutputStream(outfile); out = new BufferedOutputStream(foutst); // 出力するデータの例. byte[] utf8bytes = "文字列".getBytes("utf-8"); byte[] CRLF = "\r\n".getBytes("utf-8"); // データを出力する. out.write(utf8bytes); out.write(CRLF); out.flush(); } finally { try { if (out != null) { out.close(); } } catch (IOException ex) {} } |
注:ここでは例外をcatchしません。例外が発生したときは,finallyで後始末をしたあとで,呼び出し元で例外をcatchすることとします。
■以上からファイル変換メソッドを作る
これまでのコードをまとめて変換プログラムを作ると,以下のようになります。
※出力バッファサイズの指定を追加しています。
※こちらの記事の内容を反映しています(2015/07/05)。
import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; public class ConvtoUTF8 { //---------------------------------------------------------------------- private static final String INPUT_ENCODING = "MS932"; private static final String OUTPUT_ENCODING = "utf-8"; private static final int OUTPUT_BUFFER_SIZE = 1024*64; private static final byte[] CRLF; static { try { CRLF = "\r\n".getBytes(OUTPUT_ENCODING); } catch (UnsupportedEncodingException ex) {} } //---------------------------------------------------------------------- /** * 入力ファイルを読み込んで変換処理を行い,出力ファイルに書き出す. * 変換内容は,1)文字コードをMS932からUTF-8へ. 2)改行コードをCRLFに統一. * @param infile 入力ファイル. * @param outfile 出力ファイル. * @throws IOException */ private static void convertFile ( File infile, File outfile) throws IOException { FileInputStream finst = null; InputStreamReader reader = null; BufferedReader in = null; FileOutputStream foutst = null; BufferedOutputStream out = null; try { finst = new FileInputStream(infile); reader = new InputStreamReader(finst, INPUT_ENCODING); in = new BufferedReader(reader); foutst = new FileOutputStream(outfile); out = new BufferedOutputStream(foutst, OUTPUT_BUFFER_SIZE); String line; while ((line = in.readLine()) != null) { out.write(line.getBytes(OUTPUT_ENCODING)); out.write(CRLF); } out.flush(); } finally { try { if (out != null) { out.close(); } } catch (IOException ex) {} try { if (in != null) { in.close(); } } catch (IOException ex) {} } } } |
次回の記事及び次々回の記事にて,上記コードを使って文字コード変換コマンドラインツールを作ります。
【著作権表記】上記コードを含む本ブログのプログラムコードは,私的利用可,商用利用可,改変しての利用可です。利用の際に作者に許諾を得る必要はありません。
■関連書籍をAmazonで検索:[Java]
●EFFECTIVE JAVA 第2版 (The Java Series)
←この記事が役に立ったという方はクリックお願いします。
| 固定リンク
「Java」カテゴリの記事
- Java:Reader/Writerにおけるclose()メソッド呼び出しの流儀(2015.06.29)
- Java:例外が起こったときに実行されるコードとされないコード(2015.03.31)
- Java:前回作成したコードの処理速度を比較する(2015.03.15)
- Java:数値を3桁ごとのカンマ区切りの文字列にする(2015.03.02)
- Java:全角の数値文字列を数値として受け付ける(2015.01.19)