2016-07-27 13 views
0

Ich habe die folgende Methode, die einen Quellcode konvertiert mit gvim html:Java-Prozess waitfor

String code2html(String s) throws Exception { 
    if (s == null || s.length() == 0) return ""; 
    String txtfile = "dummyFile"+(UUID.randomUUID().toString())+".txt"; 
    String t; 
    //PrintWriter w = new PrintWriter(Konst.FPATH+"tmp.txt","UTF-8"); 
    File fl = new File(Konst.FPATH+txtfile); 
    FileWriter fw = new FileWriter(fl); 
    PrintWriter w = new PrintWriter(fw); 
    w.println(s); 
    w.close(); 
    Runtime rt = Runtime.getRuntime(); 
    String T; 
    try { 
     // Process pr = rt.exec(T = "gvim -c \"set syntax=Java\" -c \"wq\" -c \"q\" "+Konst.FPATH+"tmp.txt"); 
     //Process pr = rt.exec(T = "gvim "+Konst.FPATH+"tmp.txt -s "+Konst.FPATH+"scrip.vim"); 
     Process pr = rt.exec(T = "gvim "+Konst.FPATH+txtfile+" -s "+Konst.FPATH+"scrip.vim"); 
     System.out.println(T); 
     FileOutputStream fos; 

     StreamGobbler errorGobbler = new StreamGobbler(pr.getErrorStream(),"ERROR"); 
     StreamGobbler outputGobbler = new StreamGobbler(pr.getInputStream(),"OUTPUT",fos=new FileOutputStream(Konst.FPATH+"garbage.out")); 

     errorGobbler.start(); 
     outputGobbler.start(); 

     fos.flush(); 
     fos.close(); 
     int exitVal = pr.waitFor(); 

     StringBuilder sb = new StringBuilder(); 

     //BufferedReader b = new BufferedReader(new FileReader(Konst.FPATH + "tmp.txt.html")); 
     if (exitVal == 0) { 
      BufferedReader b = new BufferedReader(new FileReader(Konst.FPATH + txtfile + ".html")); 
      while ((t = b.readLine()) != null && !(t.length() >= 5 && t.substring(0, 5).equals("<body"))) ; 
      do { 
       sb.append(t + "\n"); 
      } while ((t = b.readLine()) != null && !(t.length() >= 6 && t.substring(0, 6).equals("</body"))); 
      sb.append(t); 
      return sb.toString(); 
     } 
     else return ""; 
    } 
    catch (Throwable e) { 
     e.printStackTrace(); 
    } 
    return ""; 
} 

Der relevante StreamGobbler ist hier:

class StreamGobbler extends Thread { 
InputStream is; 
String type; 
OutputStream os; 

StreamGobbler(InputStream is, String type) { 
    this(is,type,null); 
} 
StreamGobbler(InputStream is, String type, OutputStream os) { 
    this.is = is; this.type = type; this.os = os; 
} 
@Override 
public void run() { 
    try { 
     PrintWriter pw = null; 
     if (os != null) { 
      pw = new PrintWriter(os); 
     } 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader r = new BufferedReader(isr); 
     String line = null; 
     while ((line = r.readLine()) != null) { 
      if (pw != null) 
       pw.print(line); 
      System.out.println(type + ">" + line); 
     } 
     if (pw != null) 
      pw.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

So Gvim soll eine Quelle konvertieren Code in eine HTML-Datei namens dummy + random string.html. Und das tut es auch. Nur wenn es zu BufferedReader kommt, um die Datei zu lesen, findet sie es NICHT ("Keine solche Datei oder Verzeichnis"), obwohl die Datei in dem relevanten Ordner erscheint. Also, offensichtlich ist die Datei erstellt AFTER BufferedReader versucht, Zugriff ist trotz des Befehls waitFor(). Wie behebe ich das?

+0

print 'Konst.FPATH + txtfile +" .html "' Wert und prüfen, ob dieser Pfad korrekt ist oder nicht – Sanjeev

+0

Ja, es ist korrekt, die Datei erscheint in diesem Pfad. – Ilonpilaaja

+0

Versuchen Sie, kurz vor dem Überprüfen des Exitwerts durch Thread.sleep eine Verzögerung einzubringen. – Sanjeev

Antwort

1

Manchmal dauert es einige Zeit, um die IO-Operationen nach Abschluss eines Prozesses mit Runtime#exec abzuschließen. Versuchen Sie daher, eine Verzögerung von Thread#sleep nach Process#waitFor zu setzen, damit die IO-Verarbeitung abgeschlossen ist. Und dann versuche, die Zieldatei zu lesen.

Hoffe, das hilft.

+0

Ich erinnere mich, irgendwo gelesen zu haben, dass "Schlaf" nur "Schlaf" vorschlägt, also habe ich es nicht einmal versucht. Jetzt funktioniert es. Vielen Dank. – Ilonpilaaja

+0

Froh, dass es dir geholfen hat :) – Sanjeev