5

シェル (xterm) を開いて操作しようとしています (コマンドを書き、シェルの出力を読み取ります)。

動作しないコードのサンプルを次に示します。

public static void main(String[] args) throws IOException {
    Process pr = new ProcessBuilder("xterm").start();
    PrintWriter pw = new PrintWriter(pr.getOutputStream());
    pw.println("ls");
    pw.flush();
    InputStreamReader in = new InputStreamReader(pr.getInputStream());
    System.out.println(in.read());
}

このプログラムを実行すると、「xterm」ウィンドウが開き、「ls」コマンドが入力されません。ウィンドウを閉じたときにのみ「-1」が出力され、シェルから何も読み取られません

重要-

私はちょうど使用できることを知っています:
Process pr = new ProcessBuilder("ls").start();

出力を取得するには、「xterm」を開いて他の用途に使用する必要があります

どうもありがとう

4

2 に答える 2

5

問題は、xtermプロセスの標準の入力と出力が、ターミナルウィンドウに表示される実際のシェルに対応していないことです。xtermではなく、シェルプロセスを直接実行する方が成功する可能性があります。

Process pr = new ProcessBuilder("sh").start();
于 2012-11-17T14:36:39.297 に答える
2

ここでshellは、 onとやり取りする方法の完全な Java の主な例を示しますjava 8(Java 4,5,6 でそれを行うのは本当に簡単です)。

出力例

$ javac Main.java
$ java Main
echo "hi"
hi

コード

import java.io.*;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;


public class Main {

    public static void main(String[] args) throws IOException, InterruptedException {

        final List<String> commands = Arrays.asList("/bin/sh");
        final Process p = new ProcessBuilder(commands).start();

        // imprime erros
        new Thread(() -> {
            BufferedReader ir = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            String line = null;
            try {
                while((line = ir.readLine()) != null){
                    System.out.printf(line);
                }
            } catch(IOException e) {}
        }).start();

        // imprime saida
        new Thread(() -> {
            BufferedReader ir = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            try {
                while((line = ir.readLine()) != null){
                    System.out.printf("%s\n", line);
                }
            } catch(IOException e) {}
        }).start();

        // imprime saida
        new Thread(() -> {
            int exitCode = 0;
            try {
                exitCode = p.waitFor();
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            System.out.printf("Exited with code %d\n", exitCode);
        }).start();


        final Scanner sc = new Scanner(System.in);
        final BufferedWriter bf = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
        final String newLine = System.getProperty("line.separator");
        while(true){
            String c = sc.nextLine();
            bf.write(c);
            bf.newLine();
            bf.flush();
        }

    }

}
于 2016-02-08T02:07:11.653 に答える