Совместное использование ввода-вывода между программами Java

#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 . Это работает именно так, как я хотел. Еще раз спасибо.