質問: 1; i <= 120000; i++) { Thread.sleep(1); pw.println(BigDecimal.valueOf(i * 0.001).toPlainString() + "秒経過"); } }catch(IOException e){ e.printStackTrace(); System.out.println(e); System.exit(5); }catch(InterruptedException e){ System.out.println("try-catchが必要です。"); } }else{ System.out.println("ファイルに書き込めません"); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } } ### 試したこと ■環境 ・rhel7 ・nfs v3 マウントオプション:soft,timeo=50,retran=2 ・java version "1.7.0_171" ■シナリオ 1/NFSに「soft,timeo=50,retran=2」オプションでNFSマウントします。 (NFSサーバがダウンした場合、ls等のコマンドに対して2分程でI/Oエラーが返ります。) 2上記のjavaプログラムを実行します。 (1000ミリ秒間隔で1の領域にあるテキストファイルに2分間書き込みします。) 3NFSサーバのサービスを止めます。 42分ほど待ってNFSのI/Oエラーによりjavaプログラムがエラーを検知して終了すること。 ### 補足情報(FW/ツールのバージョンなど) 不足情報がありましたらご指摘願います。
回答: ### 解決 ~~com.sunパッケージのXFile、XFileWriterを使用することでNFSのI/Oエラーを検知出来ました。 com.sunパッケージは以下から入手しました。 リンク内容 ※com.sunパッケージを全てコンパイルするには、上記以外にもう少しクラスが必要です。 (sun.net.wwwパッケージのクラスとかetc)~~ ・PrintWriterクラスはIOExceptionをスローしない事の認識不足でした。 ・XFileWriterは不要でした。普通にFileWriterクラスを渡したBufferedWriterでIOExceptionを拾えました。 ・IOErrorに関しては今回使用したクラスではスローしないようです。(Consoleクラスではスローする模様) ### 懸念 ~~上記解決方法では、結局のところBufferedWriterとPrintWriterは使わず、FileWriterで書き込みしているのと同等です。(XFileWriter.writeで書き込み処理を行うように修正しました。) ※BufferedWriterにXFileオブジェクトを渡してもI/Oエラーは検知出来ませんでした。。。~~ ~~できればXFileWriterでの書き込みでなく、BufferedWriterとPrintWriterで書き込みを行いつつI/O Exceptionを検知したいのですが・・・。~~