我想编写一个运行外部“java myprog< input.txt> output.txt”命令的Java程序.最终目标是在两个不同的程序上运行此命令,并将它们的输出相似性与各自的输出文件进行比较.
我想我已经阅读了关于使用ProcessBuilder运行外部程序的所有相关文章,以及关于在该外部程序中处理用户输入的一些条目,但我仍然无法使其工作.根据我的阅读,我认为最好的方法是不运行上面的确切命令,而是读取input.txt文件并将其逐字节地提供给Process对象,然后收集输出并将其写入输出.txt …我对其他选项100%开放.
我根据读数将下面的代码放在一起.它似乎正确地将input.txt中的输入提供给myprog,但是当我尝试将外部程序的输出打印到控制台进行验证时,程序会在myprog中预期(惊讶)用户输入的位置挂起.
无论有没有redirectErrorStream(true)行,我都会遇到同样的问题.
我真的希望这是Java,因为我打算与我将比较的程序输出的人共享源代码,他们主要只熟悉Java.
@H_403_15@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的内容:
@H_403_15@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文件就是
@H_403_15@p
output.txt文件应该是
@H_403_15@Hello world! Enter something:
最佳答案
我想知道你的问题是否部分与不使用单独的线程读取输入和写入输出有关.例如:
@H_403_15@ public static void main(String args[]) { try { // WANT: "java myprog < input.txt > output.txt" String inputFile = "input.txt"; String outputFile = "output.txt"; // my ProcessBuilder Strings will be different from yours ProcessBuilder pb = new ProcessBuilder("java","-cp",".;bin;","yr12.m04.a.MyProg"); pb.redirectErrorStream(true); Process p = pb.start(); final OutputStream pos = p.getOutputStream(); final PrintWriter pw = new PrintWriter(pos); final InputStream fis = new FileInputStream(inputFile); final BufferedReader fileBr = new BufferedReader(new InputStreamReader(fis)); InputStreamReader isr = new InputStreamReader(p.getInputStream()); final BufferedReader br = new BufferedReader(isr); new Thread(new Runnable() { public void run() { String lineRead; try { while ((lineRead = br.readLine()) != null) { System.out.println(lineRead); } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } }).start(); new Thread(new Runnable() { public void run() { try { String lineRead; while ((lineRead = fileBr.readLine()) != null) { pw.println(lineRead); } } catch (IOException e) { e.printStackTrace(); } finally { if (pw != null) { pw.close(); } if (fileBr != null) { try { fileBr.close(); } catch (IOException e) { e.printStackTrace(); } } } } }).start(); } catch (IOException e) { e.printStackTrace(); } } // end main