« JavaScript:excanvasを使ってWebページに画像を表示する | トップページ | Java:文字コード変換ツールを作る(2)コマンドラインツール その1 »

Java:文字コード変換ツールを作る(1)文字コード変換

JavaのStringクラスは文字コード変換機能を備えています。今回はこの機能を使って,ファイルから読み込んだテキストを文字コード変換して新規テキストファイルに出力するプログラムを作ってみます。
変換する文字コードは,とりあえず「MS932」(Shift_JIS)から「UTF-8」への変換にしました。
加えて「テキストを行単位で読み込んで変換し,出力時に各行の終わりに改行を出力する」ことで,改行コードを揃える機能をもたせます。改行コードはCRLFを出力します。

■Stringクラスの文字コード変換

Stringクラスの文字列を,文字コードを指定して取り出すのは以下のようなコードになります。

String str = "文字列";
byte[] utf8bytes = str.getBytes("utf-8");
取り出した結果はbyteの配列になります。このバイト列をファイルに書き出します。

改行について,JavaにおけるCRLFの文字列表現は「"\r\n"」です。(「\」はバックスラッシュ)
これより,CRLFのバイト列は以下のように取得します。

byte[] CRLF = "\r\n".getBytes("utf-8");

改行コードは固定なので,クラス変数で定義しても良いかと思います。しかしながら,クラス変数として以下のように書くと,コンパイルエラーになってしまいます。
private static final byte[] CRLF = "\r\n".getBytes("utf-8");
エラーの内容は,「UnsupportedEncodingException」例外が起きる可能性があるのでその対応が必要,というものです。クラス変数の初期化で例外対応が必要な場合は少々工夫が必要になります。この場合の初期化コードは以下のようにして対応できます。
※例外に対する処理は,文字コード指定が固定なので特に行いません。
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)



にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ プログラム・プログラマへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。


ドミノ・ピザ【PC向けサイト】

|

« JavaScript:excanvasを使ってWebページに画像を表示する | トップページ | Java:文字コード変換ツールを作る(2)コマンドラインツール その1 »

Java」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: Java:文字コード変換ツールを作る(1)文字コード変換:

« JavaScript:excanvasを使ってWebページに画像を表示する | トップページ | Java:文字コード変換ツールを作る(2)コマンドラインツール その1 »