Чтение вывода из java.lang.Process - читать нечего - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь выполнить команду терминала в Linux через Java, и я не могу получить какой-либо ввод от inputStream.

Это мой код

            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();
    }

Процесс выполняется и сразу же терминал закрываетсяи не выводится и печатается.С другой стороны, если я составлю неизвестную команду, я получу все строки с советами, как использовать команды.Та же проблема у меня была с 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", чтобы получить все жесткие ссылки на файл, поэтомуесть более простой способ.

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

xterm - это не способ выполнения процессов в Unix, это не оболочка.оболочка - это что-то вроде "/ bin / sh".однако «find» - это обычный исполняемый файл Unix, поэтому вам нужно просто выполнить это напрямую, например, new ProcessBuilder("find", "/home").и да, вы всегда должны обрабатывать потоки в отдельных потоках, как рекомендуется этой статьей .

1 голос
/ 05 марта 2012

Во-первых, не пытайтесь выполнить команду с xterm, это бессмысленно; просто сделай это напрямую. Во-вторых, будьте осторожны при составлении массива командных строк, чтобы поместить одно слово в каждую строку; передача, например, «find / home» в виде одной строки из множества в ProcessBuilder приведет к ошибке.

...