#java #io #inputstream #outputstream
#java #io #входной поток #outputstream
Вопрос:
Этот вопрос касается перенаправления ввода и вывода между двумя программами Java. Исходный код для упрощенного примера моей проблемы приведен ниже.
Это prog1:
import java.io.*;
public class prog1{
public static void main(String[] args) throws IOException{
Runtime rt = Runtime.getRuntime();
Process prog2 = rt.exec("java prog2");
System.out.println("prog2 has executed.");
}
}
В отдельном файле я написал prog2, где я запускаю Internet Explorer, чтобы убедиться, что выполнение прошло успешно:
import java.io.*;
public class prog2{
public static void main(String[] args) throws IOException{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter a string: ");
System.out.println("You entered " in.readLine() ". Starting Explorer...");
Runtime.getRuntime().exec("C:\Program Files (x86)\Internet Explorer\iexplore.exe");
}
}
Это то, что я вижу, если запускаю prog2:
> java prog2
Enter a string: hello ** Here the program waited for my input **
You entered hello. Starting Explorer... ** Here Internet Explorer opens a new window **
Это то, что я вижу, если запускаю prog1:
> java prog1
prog2 has executed. ** Internet Explorer opens a new window **
Обратите внимание, что prog2 не запрашивал у меня ввод и ничего не выводил. Моя цель состоит в том, чтобы произошло следующее:
> java prog1
Enter a string: hello ** Here I wish for the program to await my input **
You entered hello. Starting Explorer... ** Here I wish for an Explorer window to open **
prog2 has executed.
Я считаю, что для решения этой проблемы потребуется хорошее знание перенаправления ввода-вывода, но, к сожалению, я совершенно неопытен в этой области. Заранее благодарю вас всех.
Девин
Ответ №1:
Замените это:
Process prog2 = rt.exec("java prog2");
С помощью этого:
Process prog2 = new ProcessBuilder("java", "prog2").inheritIO().start();
ProcessBuilder является предпочтительной заменой методов Runtime.exec.
Комментарии:
1. Ваш ответ был очень полезен. Спасибо. Теперь, когда я запускаю prog1, я вижу «prog2 выполнен». печатается в командной строке, за которой следует «Введите строку: » в следующей строке. Это ближе к моей цели, но не совсем там. Есть ли рекомендуемый способ заставить первую программу ждать завершения второй?
2. Я нашел решение, которое искал. После Process prog2 = new ProcessBuilder(«java», «prog2»).inheritIO().start(); Я добавил prog2.waitFor(); и catch для потенциального исключения InterruptedException . Это работает именно так, как я хотел. Еще раз спасибо.