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