4
public class LinuxInteractor {

public static String executeCommand(String command)
{
System.out.println("Linux command: " + command);

try 
{
   Process  p = Runtime.getRuntime().exec(command);
   p.waitFor();
   BufferedReader bf=new BufferedReader(new InputStreamReader( p.getInputStream()));
   String str=bf.readLine();
   System.out.println("inputStream is::"+str);
   while( (str=bf.readLine()) != null)
   {
       System.out.println("input stream is::"+str);        
   }
   System.out.println("process started");
}
catch (Exception e) {
System.out.println("Error occured while executing Linux command. Error       Description: "
    + e.getMessage());
    e.printStackTrace();
}
}

コンソールからスクリプトを実行すると、機能しています。しかし、Javaプログラムを介しInputStream(Str)null.

私が使用できる他のアプローチはありますか?

4

2 に答える 2

8

解決策
読み取りと実行を別のスレッドで行うようにしてください。

より良い代替手段は、「汚い」作業を処理するProcessBuilderを使用することです。
ブロック内のコードは次のtryようになります。

/* Create the ProcessBuilder */
ProcessBuilder pb = new ProcessBuilder(commandArr);
pb.redirectErrorStream(true);

/* Start the process */
Process proc = pb.start();
System.out.println("Process started !");

/* Read the process's output */
String line;             
BufferedReader in = new BufferedReader(new InputStreamReader(
        proc.getInputStream()));             
while ((line = in.readLine()) != null) {
    System.out.println(line);
}

/* Clean-up */
proc.destroy();
System.out.println("Process ended !");

この短いデモも参照してください。


問題の原因Java Docs
よると、 waitFor()

この Process オブジェクトによって表されるプロセスが終了するまで、必要に応じて現在のスレッドを待機させます。

したがって、プロセスが終了した後にプロセスの出力ストリームを取得しようとしているため、null.


(回答を大幅に改訂して申し訳ありません。)

于 2013-06-11T07:11:17.643 に答える
1

別のスレッドでこれを行う必要があります。

Process process = Runtime.getRuntime().exec(command);
LogStreamReader lsr = new LogStreamReader(process.getInputStream());
Thread thread = new Thread(lsr, "LogStreamReader");
thread.start();


public class LogStreamReader implements Runnable {

    private BufferedReader reader;

    public LogStreamReader(InputStream is) {
        this.reader = new BufferedReader(new InputStreamReader(is));
    }

    public void run() {
        try {
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

次に、入力処理用の 2 つ目のスレッドが必要です。また、stdout と同じように stderr を処理したい場合もあります。

于 2013-06-11T07:12:14.393 に答える