3

これは、外部プログラムの実行からのエラーストリームをログに記録するログ機能です。すべてが正常に動作します。しかし、エラーストリームにデータがない場合は、ログファイルを生成したくありません。現在、ゼロサイズのファイルを作成しています。助けてください。

FileOutputStream fos = new FileOutputStream(logFile);
PrintWriter pw = new PrintWriter(fos);

Process proc = Runtime.getRuntime().exec(externalProgram);

InputStreamReader isr = new InputStreamReader(proc.getErrorStream());
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
{
   if (pw != null){
      pw.println(line);
      pw.flush(); 
   }
}

ありがとうございました。

4

2 に答える 2

3

FileOutputStreamとの作成PrintWriterを必要になるまで延期するだけです。

PrintWriter pw = null;

Process proc = Runtime.getRuntime().exec(externalProgram);

InputStreamReader isr = new InputStreamReader(proc.getErrorStream());
BufferedReader br = new BufferedReader(isr);
String line;
while ( (line = br.readLine()) != null)
{
   if (pw == null)
   {
      pw = new PrintWriter(new FileOutputStream(logFile));
   }
   pw.println(line);
   pw.flush(); 
}

個人的には、私は大ファンではありPrintWriterません。すべての例外を飲み込むだけであるという事実が私に関係しています。OutputStreamWriterまた、エンコーディングを明示的に指定できるようにするためにも使用します。とにかく、それはここでの本当の質問は別としてです。

于 2010-07-26T12:49:28.690 に答える
1

明らかなことは変更することです

FileOutputStream fos = new FileOutputStream(logFile);
PrintWriter pw = new PrintWriter(fos);
....
   if (pw != null){
   ...
   }

FileOutputStream rawLog = null;
try {
    PrintWriter Log = null;
    ....
       if (log == null) {
           rawLog = new FileOutputStream(logFile);
           log = new PrintWriter(log, "UTF-8");
       }
       ...
} finally {
    // Thou shalt close thy resources.
    // Icky null check - might want to split this using the Execute Around idiom.
    if (rawLog != null) {
        rawLog.close();
    }
}
于 2010-07-26T12:49:36.867 に答える