Я хочу написать программу на Java, которая запускает внешнюю команду "java myprog < input.txt > output.txt". Конечная цель состоит в том, чтобы запустить эту команду в двух разных программах и сравнить сходство их выходных данных с соответствующими выходными файлами.
Кажется, я прочитал почти все соответствующие статьи об использовании ProcessBuilder для запуска внешней программы и несколько статей об обработке пользовательского ввода в этой внешней программе,но я все еще не могу заставить вещи работать. Из того, что я прочитал, я думаю, что лучший подход - не запускать точную команду выше, а вместо этого читать файл input.txt и передавать его байт -на -байт в объект Process, затем собирать вывод и напишите это в output.txt... Я на 100% открыт для других вариантов.
Я составил приведенный ниже код на основе своих показаний. Похоже, что входные данные из input.txt правильно передаются в myprog, но когда я пытаюсь распечатать вывод внешней программы на консоль для проверки, программа зависает в точке, где (неожиданно )ожидается ввод пользователя в myprog.
Я получаю те же проблемы со строкой redirectErrorStream (true )и без нее.
Я действительно хочу, чтобы это было на Java, так как я планирую поделиться исходным кодом с людьми, результаты работы которых я буду сравнивать, а они в основном знакомы только с Java.
import java.io.*;
import java.util.*;
public class test7 {
public static void main(String args[]) {
try {
// WANT: "java myprog < input.txt > output.txt"
String inputFile = "input.txt";
String outputFile = "output.txt";
ProcessBuilder pb = new ProcessBuilder("java","myprog");
pb.redirectErrorStream(true); // merge stdout, stderr of process
Process p = pb.start();
// write input to the running program
OutputStream pos = p.getOutputStream();
InputStream fis = new FileInputStream(inputFile);
int read = 0;
while ( (read = fis.read()) != -1) {
pos.write(read);
}
fis.close();
// get output of running program
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
// HANGS HERE WHEN USER INPUT REQUIRED
String lineRead;
while ((lineRead = br.readLine()) != null) {
System.out.println(lineRead);
}
}
catch (IOException e) {
e.printStackTrace();
}
} // end main
}
Вот содержимое myprog.java:
import java.io.*;
public class myprog {
public static void main(String args[]) throws IOException {
System.out.println("Hello world!");
System.out.println("Enter something:");
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
// the readLine() command causes ProcessBuilder to hang
cin.readLine();
}
}
А файл input.txt просто
p
Файл output.txt должен быть
Hello world!
Enter something: