2010-07-26 4 views
3

Il s'agit d'une fonction de consignation qui enregistre le flux d'erreurs lors de l'exécution d'un programme externe. Tout fonctionne bien. Mais je ne veux pas générer le fichier journal lorsqu'il n'y a pas de données dans le flux d'erreurs. Actuellement, il crée un fichier de taille zéro. S'il vous plaît aider.Ignorer la création d'un fichier dans FileOutputStream lorsqu'il n'y a pas de données dans Inputstream

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

Merci.

Répondre

3

reportent simplement la création du FileOutputStream et PrintWriter jusqu'à ce que vous avez besoin:

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

Personnellement, je ne suis pas un grand fan de PrintWriter - le fait qu'il engloutit seulement toutes les exceptions qui me préoccupe. J'utiliserais également OutputStreamWriter pour que vous puissiez spécifier explicitement l'encodage. Quoi qu'il en soit, c'est en dehors de la vraie question ici.

+0

Merci Skeet @ Jon. J'ai trouvé mon erreur. J'ai essayé de différer seulement le PrintWriter, parce que FileOutputStream est réellement un paramètre de la fonction. On dirait que j'ai besoin de changer mon type de paramètre en fichier puis créer FileOutputStream à l'intérieur de la boucle. – Sujee

1

La chose évidente à faire est de changer

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