Перенаправление Времени Выполнения.getRuntime().exec () вывод с системой.разбивка();

У меня есть тестовая программа.java:

import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception {
        System.setOut(new PrintStream(new FileOutputStream("test.txt")));
        System.out.println("HelloWorld1");
        Runtime.getRuntime().exec("echo HelloWorld2");
    }
}

предполагается, что это напечатает HelloWorld1 и HelloWorld2 в текст файла.формат txt. Однако, когда я просматриваю файл, я вижу только HelloWorld1.

  1. куда делся HelloWorld2? Она растворилась в воздухе?

  2. допустим, я хочу перенаправить HelloWorld2 для тестирования.txt также. Я не могу просто добавить ">тест>.txt " в команде, потому что я получу файл уже открыт ошибка. Так как же мне быть? это?

3 ответов


стандартный вывод среды выполнения.exec не отправляется автоматически на стандартный вывод вызывающего объекта.

что - то вроде этого-получить доступ к стандартному выходу раздвоенного процесса, прочитать его, а затем записать. Обратите внимание, что вывод из раздвоенного процесса доступен для родителя с помощью getInputStream() метод экземпляра процесса.

public static void main(String[] args) throws Exception {
    System.setOut(new PrintStream(new FileOutputStream("test.txt")));
    System.out.println("HelloWorld1");

     try {
       String line;
       Process p = Runtime.getRuntime().exec( "echo HelloWorld2" );

       BufferedReader in = new BufferedReader(
               new InputStreamReader(p.getInputStream()) );
       while ((line = in.readLine()) != null) {
         System.out.println(line);
       }
       in.close();
     }
     catch (Exception e) {
       // ...
     }
}

начиная с JDK 1.5 существует java.ленг.ProcessBuilder, который также обрабатывает потоки std и err. Это своего рода замена java.ленг.Runtime и вы должны использовать его.