2012-03-05 18 views
1

LinuxのトラフJavaでterminalコマンドを実行しようとしていますが、inputStreamからの入力を取得できません。java.lang.Processからの出力の読み取り - 何も読み取ることはありません

これは私のコードである

  ProcessBuilder build = new ProcessBuilder("/usr/bin/xterm", "find /home"); 

    Process pr = null; 
      BufferedReader buf; 
    try { 
      build.redirectErrorStream(true); 
      pr = build.start(); 
    buf = new BufferedReader(new InputStreamReader(pr.getInputStream())); 

    String line = buf.readLine(); 
    pr.waitFor(); 
    while (true) { 
    System.out.println(line + "sadasdas"); 
      line = buf.readLine(); 
    } 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

処理が実行され、直ちに端末閉じ、何も出力がcatchedず、印刷されています。一方、私は未知のコマンドを作成する場合、私はどのようにコマンドを使用するヒントとすべての行を取得します。私はWindowsのcmdと同じ問題があった。私はgetRuntime.exec(cmd)メソッドを使用しようとしましたが、最後は同じです。

また、私は読んで何がまだありません作るこの

public class kurdee 
{ 
    public static Thread thread; 
public kurdee() 
{ 
List cmd = new LinkedList(); 
    cmd.add(new String("/usr/bin/xterm")); 
    cmd.add(new String("find")); 
    thisProc thispr = new thisProc(cmd); 
    this.thread = new Thread(thispr); 
    thread.start(); 
    reader rd = new reader(thispr.proc); 
    Thread thread1 = new Thread(rd); 
    thread1.start();} 

public static void main(String args[]) 
{ 

    java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       kurdee kurd = new kurdee(); 

      } 
     }); 





} 
} 
class reader implements Runnable 
{ 

    private BufferedReader buf; 
    private Process proc; 
    public reader(Process proc) 
    { 
     this.proc=proc; 
     this.buf = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
    } 

    public void run() 
    { 
       String line=""; 
       System.out.println("Thread is alive"); 
       try{ 
        //Thread.sleep(1000); 
     line = buf.readLine(); 
       }catch(Exception ex){System.out.println(ex + " before first while started");} 
       while(kurdee.thread.isAlive()) 
       { 
        System.out.println("Thread is alive"); 

      while(line!=null) 
      { 
           try{ 
       //System.out.println(proc.exitValue()); 
       System.out.println(line + " asd"); 
       line=buf.readLine(); 
           }catch(Exception e){System.out.println(e + " Inner while loop");} 
      } 
       } 
    } 
} 

class thisProc implements Runnable 
{ 
    private ProcessBuilder build; 
    public static Process proc=null; 

    public thisProc(List<String> args) 
    { 
     this.build = new ProcessBuilder(args); 
     build.redirectErrorStream(true); 
       try{ 

       this.proc = build.start(); 
       }catch(Exception ex){System.out.println(ex + " proc class");} 



    } 

    public void run() 
    { 
     try{ 

       proc.waitFor(); 
       }catch(Exception ex){System.out.println(ex + " proc class");}  
    } 
} 

しかしなどを呼び出すスレッドの任意の組み合わせを持つように見えたプロセスと読者のために作成した別のスレッドに試してみました。

"find/home -xdev -samefile file"コマンドを使用してすべてのハードリンクをファイルに保存しようとしていますが、もっと簡単な方法があります。

+0

ちょっと好奇心が強い、なぜ2番目を選んだのですか?後で私の答えは同じですか? – jtahlborn

答えて

1

まず、xtermでコマンドを実行しようとしないでください。それは意味がありません。ちょうどそれを直接してください。第2に、各文字列に1つの単語を入れるコマンド文字列の配列を作成するときは注意が必要です。たとえば、 "find/home"を単一の文字列として渡すと、ProcessBuilderがエラーになります。

2

xtermはUNIXでプロセスを実行する方法ではなく、シェルではありません。シェルは "/ bin/sh"のようなものです。しかし、 "find"は通常のunix実行ファイルなので、直接実行する必要があります。 new ProcessBuilder("find", "/home")。はい、あなたは常にthis articleで推奨されるように、別々のスレッドでストリームを処理する必要があります。

関連する問題