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?
print 'Konst.FPATH + txtfile +" .html "' Wert und prüfen, ob dieser Pfad korrekt ist oder nicht – Sanjeev
Ja, es ist korrekt, die Datei erscheint in diesem Pfad. – Ilonpilaaja
Versuchen Sie, kurz vor dem Überprüfen des Exitwerts durch Thread.sleep eine Verzögerung einzubringen. – Sanjeev