output.txt"的 Java 程序-6ren"> output.txt"的 Java 程序-我想编写一个运行外部“java myprog output.txt”命令的 Java 程序。最终目标是在两个不同的程序上运行此命令,并从各自的输出文件中比较它们的输出相似性。 我想我已经阅读了几乎所-6ren">
gpt4 book ai didi

java - 运行外部 "java myprog < input.txt > output.txt"的 Java 程序

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:46 26 4
gpt4 key购买 nike

我想编写一个运行外部“java myprog < input.txt > output.txt”命令的 Java 程序。最终目标是在两个不同的程序上运行此命令,并从各自的输出文件中比较它们的输出相似性。

我想我已经阅读了几乎所有关于使用 ProcessBuilder 运行外部程序的相关文章,以及关于在该外部程序中处理用户输入的几篇文章,但我仍然无法正常工作。根据我的阅读,我认为最好的方法是不运行上面的确切命令,而是读取 input.txt 文件并将其逐字节输入 Process 对象,然后收集输出并将其写入输出.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:

最佳答案

我想知道您的问题是否部分与没有使用单独的线程来读取输入和写入输出有关。例如:

   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

关于java - 运行外部 "java myprog < input.txt > output.txt"的 Java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10211821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com