ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

BufferdReaderクラスのreadLineメソッドが終わらない?

今回は、Javaについて個人的に躓いた内容がありましたのでこちらに記載していこうと思います。
以下の内容は結論は出ていないので、ふ~ん、こんなことあるのね。という感じでお読みいただければと思います。

Javaで任意のファイルを読み込みする要件はよくあると思います。
ファイル読み込みの方法は様々とあるかと思いますが、今回はおそらくBASICなFileReaderをBufferdReaderでラップする方法でのファイル読み込みの話題です。

以下のようないたって簡単なJavaで書いたコードがあります。
System.inで標準入力から読み込み、"output.txt"という名前のファイルに標準入力の値を書き込みするコードです。

import java.io.*;

public class WriteFile {
    public static void main(String[] args) {
        String filename = "output.txt";
	    try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(filename)));
                String line;
                while((line = reader.readLine()) != null) {
                    writer.println(line);
                }
                reader.close();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}


IDE統合開発環境)のEclipseで上記コードを記載し、対象のファイルを選択し「実行の構成」から、入力ファイルを指定して実行したところ
処理が終わらず、"output.txt"がいつまでも解放されない?実行した上記処理がいつまでもファイルを掴んで、削除できない状態となってしまいました。。

結論としては、System.inからいつまでも入力待ちという状態となってしまい上記コードが終わらないという結果となってしまっているようです。
解決策としては、以下の通りwhile文の条件を変えてやると良いです。

■変更前

while((line = reader.readLine()) != null) {
    writer.println(line);
}

■変更後

while(reader.ready()) {
    line = reader.readLine()
    writer.println(line);
}


単純なことかと思いますが、意外と理由がわからないかもしれないのでここに記載してみました。
どこか困っている方の役に立つことができれば幸いです。

参考
BufferedReader (Java Platform SE 8)

参考URLが、Java8と古いですが、自分はまだここで止まっています・・・
いずれ、最新バージョンのJavaで新しくできるようになったこととか見てみたいですね。
では、今回はこのへんで終わりにします。