2016-08-25 6 views
1

Ich verwende mein Java-Programm vom Terminal und ich versuche, die Anzahl der Dateien in einem bestimmten Verzeichnis mit einem Linux-Befehl in meinem Code zu zählen; Ich habe es geschafft, die Ausgabe für alle anderen Befehle außer diesem zu bekommen.Java-Programm wird nicht vom Terminal ausgegeben

Mein Befehl lautet: ls somePath/*.xml | wc -l

Als ich meinen Befehl in meinem Code ausführen, scheint es, dass es nichts zu Ausgang hat, aber wenn ich exakt den gleichen Befehl im Terminal laufe funktioniert es ganz gut und gibt tatsächlich die Anzahl von XML-Dateien in diesem Verzeichnis.

Hier ist mein Code:

private String executeTerminalCommand(String command) { 
    String s, lastOutput = ""; 
    Process p; 
    try { 
     p = Runtime.getRuntime().exec(command); 
     BufferedReader br = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     System.out.println("Executing command: " + command); 
     while ((s = br.readLine()) != null){//it appears that it never enters this loop since I never see anything outputted 
      System.out.println(s); 
      lastOutput = s; 
     } 
     p.waitFor(); 
     p.destroy(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return lastOutput;//returns empty string "" 
} 

aktualisiert Code w/Ausgabe

private String executeTerminalCommand(String command) { 
     String s, lastOutput = ""; 
     try { 
      Process p = new ProcessBuilder().command("/bin/bash", "-c", command).inheritIO().start();   
      //Process p = Runtime.getRuntime().exec(command); 
      BufferedReader br = new BufferedReader(
        new InputStreamReader(p.getInputStream())); 
      System.out.println("Executing command: " + command); 
      while ((s = br.readLine()) != null){ 
       System.out.println("OUTPUT: " + s); 
       lastOutput = s; 
      } 
      System.out.println("Done with command------------------------"); 
      p.waitFor(); 
      p.destroy(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("LAST OUTPUT IS: " + lastOutput); 
     return lastOutput; 
    } 

Ausgang:

Executing command: find my/path -empty -type f | wc -l 
Done with command------------------------ 
1 
LAST OUTPUT IS: 
+0

vielleicht versuchen Process mit und tun 'pb.redirectErrorStream (true); ' –

+0

Probieren Sie diesen Befehl aus:' Process p = new ProcessBuilder(). Befehl ("bash", "-c", "ls somePath/*. Xml | wc -l"). InheritIO(). Start(); ' –

+0

Danke Jungs, aber leider Letzten Endes funktionierten diese nicht für mich. –

Antwort

2

eine Pipeline ausführen zu können, müssen Sie eine Shell aufzurufen und führen Sie dann Ihre Befehle in dieser Shell aus.

Process p = new ProcessBuilder().command("bash", "-c", command).start(); 

bash ruft eine Shell Ihren Befehl und -c bedeutet Befehle aus string gelesen werden auszuführen. Daher müssen Sie den Befehl nicht als Array in ProcessBuilder senden.

Aber wenn Sie Runtime dann

String[] cmd = {"bash" , "-c" , command}; 
Process p = Runtime.getRuntime().exec(cmd); 

Hinweis verwenden möchten: Sie Vorteile von ProcessBuilder überprüfen here und verfügt über hereRuntime

+1

Es ist schön, die Antwort mit 'ProcessBuilder' und' Runtime' zu ​​sehen. Die meisten Antworten schlagen vor, 'ProcessBuilder' zu verwenden und den Code in' ProcessBuilder' zu beantworten. Es hat wirklich geholfen. Vielen Dank! – SkrewEverything

Verwandte Themen