我正在将.exe文件的输出映射到我的Java应用程序。一些.exe文件接受参数作为.txt文件。如果.exe文件不需要.txt文件作为参数,则在使用ProcessBuilder()。start()运行时会从中获取输出。但是,如果需要.txt文件作为参数,则.exe文件不会提供任何输出。 .exe文件是从c程序生成的。
Process process = new Process() {
@Override
public OutputStream getOutputStream() {
return null;
}
@Override
public InputStream getInputStream() {
return null;
}
@Override
public InputStream getErrorStream() {
return null;
}
@Override
public int waitFor() throws InterruptedException {
return 0;
}
@Override
public int exitValue() {
return 0;
}
@Override
public void destroy() {
}
};
if(bench.equals("bank")) {
process = new ProcessBuilder("./ref/tinySTM/test/bank/bank", "-n"+thread_count, "-d20").start();
}
else if(bench.equals("kmeans")) {
process = new ProcessBuilder("./ref/stamp/kmeans/kmeans", "-m40", "-n40", "-t0.05", "-i random-n2048-d16-c16.txt", "-p"+thread_count).start();
}
else{
System.out.println("Error. Invalid benchmark "+bench);
System.exit(0);
}
BufferedReader input = new BufferedReader (new InputStreamReader(process.getInputStream()));
while ((op = input.readLine()) != null) {
System.out.println(op);
}
input.close();
执行库会提供适当的输出,但是执行kmeans不会提供任何输出。
答案 0 :(得分:3)
我猜测kmeans在stderr上打印了一条错误消息,但是您没有从process.getErrorStream()
中读取内容,因此该消息丢失了。这里至少有一个问题:
"-i random-n2048-d16-c16.txt"
您需要传递两个参数:
"-i", "random-n2048-d16-c16.txt"
或者,如果kmeans会将它们作为一个整体接受,那就摆脱空间:
"-irandom-n2048-d16-c16.txt"
答案 1 :(得分:1)
要添加Kugelman所说的内容,可能要使用绝对路径,具体取决于文件的位置。
答案 2 :(得分:0)
尝试类似的方法,并确保文本文件位于该位置,希望对您有所帮助
您可以通过以下方式向流程生成器继承,而不是手动将I / O写入SYSTEM OUT:
ProcessBuilder processBuilder= new ProcessBuilder("./ref/stamp/kmeans/kmeans", "-m40", "-n40", "-t0.05", "./ref/stamp/kmeans/kmeans/random-n2048-d16-c16.txt", "-p"+thread_count);
processBuilder.inheritIO();
Process process = processBuilder.start();