0
Streamをcloseする処理について
Streamをcloseする処理で奇妙な現象に悩まされています。
もしかしたら既に常識なのかもしれませんが、ネットで調べてもうまい例が見つかりませんでした。
具体的には、close処理は必ずfinally節でやるようにと一般的に言われています。
しかし、whileでinputStreamを生成、closeした場合、2度目の生成でもなぜかinputStreamのオブジェクトにアクセスできず、IOExceptionが発生してしまいます。
そのため、現在は成功時にのみcloseするようにしています。
これは同じ参照で生成したオブジェクトは一度closeされているともうアクセスできないというJavaの仕様なのでしょうか。それとも、私のコーディングがまずいのでしょうか。
このような問題を回避する一般的なコーディングパターンは存在するのでしょうか。
それとも成功時にのみcloseする方が正しいのでしょうか。
以下がコードの例です。
それぞれのメソッドを実行するとコンソールから入力受付状態になり、
数値以外が入力されると例外を投げます。
例外を投げた後、再度入力させるのが狙いです。
/*
* ストリームを使いまわす例(成功時のみcloseする)
*
*/
public static void testClose_try(){
while(true){
//reader というバッファーを作り、標準入力を代入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in),1);
try{
System.out.println("数値を入力してください。");
// reader の一行を読んでinput1 に代入
String input1 = reader.readLine();
// input1 を int型に変換して、num1 に代入する
int num1 = Integer.parseInt(input1);
// 成功したらストリームを閉じます
reader.close();
break;
} catch (NumberFormatException e){
System.out.println("数値以外は入力できません。再入力してください。");
continue;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}
}
/*
* 成功、失敗に関係なくストリームを閉じる例
*
*/
public static void testClose_finally(){
while(true){
//reader というバッファーを作り、標準入力を代入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in),1);
try{
System.out.println("数値を入力してください。");
// reader の一行を読んでinput1 に代入
String input1 = reader.readLine();
// input1 を int型に変換して、num1 に代入する
int num1 = Integer.parseInt(input1);
break;
} catch (NumberFormatException e){
System.out.println("数値以外は入力できません。再入力してください。");
continue;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
// ストリームを閉じます
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}