2012/05/08

Javaでテキストファイルの読み込みを行う

Javaでテキストファイルを読み込む場合は、Reader関連のクラスを利用します。
InputStream関連は、イメージデータなどのバイトデータを扱うクラスです。
テキストを扱うには向いていないので注意が必要です。


テキストファイルには、エンコーディングがあります。
(日本語でWindowsを利用している場合には、Shift-JISやMS932が多いです。)

テキストを読み込む場合には、エンコーディングを意識して読み込む必要があります。
Javaでは、エンコーディングの指定を省略した場合、デフォルトエンコーディングが利用されます。

デフォルトエンコーディングを確認するには、次のコードを実行してください。

 public static void main(String args[]) {
  System.out.println(System.getProperty("file.encoding"));
 }


デフォルトエンコーディングで処理する場合は、FileReaderを使います。
エンコーディングを指定する場合には、FileInputStreamを作成してから、InputStreamReaderを使います。

テキストはバッファリングして読み込む方が、効率が良くなります。


テキストを読み込む処理は、次の通りです。

■TextFileReader.java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * {@link TextFileReader}クラスです。
 * テキストファイルを読み込みます。
 * 
 * @author ardor
 * @version 1.0
 */
public class TextFileReader {
 
 /**
  * 指定したファイルをデフォルトエンコーディングで読み込み、
  * テキストを返します。
  * 
  * @param filePath ファイルパス
  * @return ファイル内容
  * @throws IOException ファイルが読み込めない場合
  */
 public String readText(String filePath) throws IOException {
  // 文字型入力ストリームクラス
  // デフォルトエンコーディングで読み込み
  Reader reader = new FileReader(filePath);
  
  // ファイルを読み込んで、テキストを返す
  return readText(reader);
 }
 
 /**
  * 指定したファイルを指定エンコーディングで読み込み、
  * テキストを返します。
  * 
  * @param filePath ファイルパス
  * @param encoding エンコーディング
  * @return ファイル内容
  * @throws IOException ファイルが読み込めない場合
  */
 public String readText(String filePath, String encoding) throws IOException {
  // 文字型入力ストリームクラス
  // エンコーディング指定で読み込み
  InputStream inputStream = new FileInputStream(filePath);
  Reader reader = new InputStreamReader(inputStream, encoding);
  
  // ファイルを読み込んで、テキストを返す
  return readText(reader);
 }
 
 /**
  * 文字型入力ストリームからテキストを読み込んで返します。
  * 
  * @param in 文字型入力ストリーム
  * @return テキスト
  * @throws IOException 文字型入力ストリームが読み込めない場合
  */
 private String readText(Reader in) throws IOException {
  // 文字型入力ストリームを構築
  BufferedReader reader = new BufferedReader(in);
  
  // テキストバッファ
  StringBuffer buff = new StringBuffer(100);
  
  try {
   // テキスト読み込み処理
   char[] cbuf = new char[1024];
   int len = 0;
   while (0 <= (len = reader.read(cbuf))) {
    buff.append(cbuf, 0, len);
   }   
  }
  finally {
   // 文字型入力ストリームをクローズ
   // BufferedReader.close()を呼び出すとコンストラクタに
   // 指定したReaderをクローズする
   close(reader);
  }
  return buff.toString();
 }
 
 /**
  * 文字型入力ストリームをクローズします。
  * 
  * @param reader 文字型入力ストリーム
  */
 private void close(Reader reader) {
  try {
   reader.close();
  }
  catch(Exception e) {
   // クローズ時の例外は何も行わない
  }
 }
}

文字型入力ストリームは必ずクローズしてください。
ストリームを開いたままにすると無駄なインスタンスが残ってしまいます。

使い方は、次の通り。
  TextFileReader reader = new TextFileReader();
  try {
   System.out.println(reader.readText("sample.txt", "UTF-8"));
  }
  catch (IOException e) {
   e.printStackTrace();
  }

0 件のコメント:

コメントを投稿