Извлекать и сохранять выходные данные из подпроцесса в Java - PullRequest
2 голосов
/ 04 июля 2011

Я работаю над тем, что требует от меня запуска подпроцесса (командной строки) и выполнения некоторых команд на нем. Мне нужно получить вывод из подпроцесса и сохранить его в файл или строку. вот что я сделал до сих пор, и это не работает:

public static void main(String args[])
{
        try
    {
        Runtime RT = Runtime.getRuntime();
        String command = "cmd /c start javap java.lang.String"; 
        File file = new File("write.txt");
        Writer output = new BufferedWriter(new FileWriter(file));
            BufferedReader br = new(BufferedReader(newInputStreamReader(RT.exec(command).getInputStream()));
        String temp = br.readLine();
        while(!temp.equals(null))
        {
            output.write(temp);
            temp = br.readLine();
        }
        output.close();
        RT.exec("exit");
    }
    catch(Exception e)
    {
        System.out.println(e);
    }
}

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

Начните изменять это:

new(BufferedReader(newInputStreamReader(

Кому:

new BufferedReader(new InputStreamReader(

Скомпилируйте и посмотрите, если у вас все еще есть проблема

edit

Также, есть веская причина, по которой вы не должны ловить Exception, вы также ловите ошибки программирования, такие как NullPointerException

 while( !temp.equals(null)) { //Throws NullPointerExceptin when temp is null

Измените его с помощью:

 while( temp != null ) { //!temp.equals(null)) {

Наконец, вам не нужно «выходить», поскольку вы на самом деле не находитесь внутри cmd.

Исправленная версия

Эта версия работает в соответствии с вашими намерениями:

import java.io.*;
class Rt { 
  public static void main(String args[]) throws Exception {
          Runtime RT = Runtime.getRuntime();
          String  command =  "javap java.lang.String" ; 
          File file = new File("write.txt");
          Writer output = new BufferedWriter(new FileWriter(file));
          BufferedReader br = new BufferedReader(new InputStreamReader(RT.exec(command).getInputStream()));
          String temp = br.readLine();
          while( temp != null ) { //!temp.equals(null)) {
              output.write(temp);
              temp = br.readLine();
          }
          output.close();
          //RT.exec("exit");
  }
}

edit Заключительные замечания:

Начиная с Java 1.5 предпочтительный способ вызова команды - это использование ProcessBuilder , и лучше использовать массив строк вместо одной строки (или varargs),

Когда вы строите свой вывод, вы можете избавиться от объекта файла и передать имя файла непосредственно в файлописатель.

При чтении строки вы можете назначить и оценить условие.

Соглашения Java о кодировании предлагают использовать открывающую скобку в том же виде.

Это будет моя версия вашего кода:

class Rt { 
   public static void main(String args[]) throws Exception {

      Writer output     = new BufferedWriter(new FileWriter ( "write.txt"));
      InputStream in    = new ProcessBuilder("javap", "java.lang.String").start().getInputStream();
      BufferedReader br = new BufferedReader( new InputStreamReader(in)); 
      String line = null;
      while( ( line = br.readLine() )   != null ) {
          output.write( line );
      }
      output.close();
  }
}

Возможно, потребуется еще немного поработатьНадеюсь, это поможет вам.

0 голосов
/ 04 июля 2011

DevDaily имеет простой пример того, как работать с Process классом.
См. Фрагмент:

import java.io.*;

public class JavaRunCommand {

    public static void main(String args[]) {
        String s = null;

        try {

            // run the Unix "ps -ef" command
            // using the Runtime exec method:
            Process p = Runtime.getRuntime().exec("ps -ef");

            BufferedReader stdInput = new BufferedReader(new 
                 InputStreamReader(p.getInputStream()));

            BufferedReader stdError = new BufferedReader(new 
                 InputStreamReader(p.getErrorStream()));

            // read the output from the command
            System.out.println("Here is the standard output of the command:\n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }

            // read any errors from the attempted command
            System.out.println("Here is the standard error of the command (if any):\n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }

            System.exit(0);
        }
        catch (IOException e) {
            System.out.println("exception happened - here's what I know: ");
            e.printStackTrace();
            System.exit(-1);
        }
    }
}

или даже отметьте этот код Я написал некоторое время назад

0 голосов
/ 04 июля 2011

Вот пример, который должен работать:

        StringBuffer outStream = new StringBuffer();
        StringBuffer errStream = new StringBuffer();
        Runtime runtime = Runtime.getRuntime();

        Process process = null;
        try {
            process = runtime.exec(command);
        } catch (IOException ex) {
            ex.printStackTrace();
            return;
        }

        InputStream outIs = process.getInputStream();
        MonitorOutputThread sout = new MonitorOutputThread(outIs, outStream);
        sout.run();

        InputStream errIs = process.getErrorStream();
        MonitorOutputThread serr = new MonitorOutputThread(errIs, errStream);
        serr.run();

        while (sout.isAlive() || serr.isAlive()) {
            try {
                sleep(100);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
                // ignore
            }
        }

И код для MonitorOutputThread

private class MonitorOutputThread extends Thread {

    private final InputStream is;
    private final StringBuffer output;

    public MonitorOutputThread(InputStream is, StringBuffer output) {
        this.is = is;
        this.output = output;
    }

    @Override
    public void run() {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        String line = null;
        try {
            while ((line = br.readLine()) != null) {
                output.append(line);
                output.append(LINE_SEPARATOR);
            }

            if (output.length() >= 1) {
                char lastChar = output.charAt(output.length() - 1);

                if (lastChar == '\n') {
                    output.deleteCharAt(output.length() - 1);
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            return;
        }
    }

}

Это должно отразить как стандартный вывод, так и стандартную ошибку команды.

...