Пропустить создание файла в FileOutputStream, если в Inputstream нет данных - PullRequest
3 голосов
/ 26 июля 2010

Это функция регистрации, которая регистрирует поток ошибок при выполнении внешней программы. Все отлично работает Но я не хочу генерировать файл журнала, когда в потоке ошибок нет данных. В настоящее время он создает файл нулевого размера. Пожалуйста, помогите.

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(); 
   }
}

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 июля 2010

Просто отложите создание 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, чтобы вы могли явно указать кодировку.Во всяком случае, это помимо реального вопроса здесь.

1 голос
/ 26 июля 2010

Очевидное, что нужно сделать, это изменить

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...