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 件のコメント:
コメントを投稿