【问题标题】:How to open an .exe file with a .txt file as an argument using ProcessBuilder如何使用 ProcessBuilder 打开带有 .txt 文件作为参数的 .exe 文件
【发布时间】:2019-03-27 04:05:36
【问题描述】:

我正在将 .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();

执行 bank 给出正确的输出,但执行 kmeans 没有给出任何输出。

【问题讨论】:

    标签: java file-io arguments


    【解决方案1】:

    我猜 kmeans 正在 stderr 上打印一条错误消息,但您没有从 process.getErrorStream() 读取,因此该消息丢失了。这里至少有一个问题:

    "-i random-n2048-d16-c16.txt"
    

    您需要传递两个参数:

    "-i", "random-n2048-d16-c16.txt"
    

    或者,如果 kmeans 将它们作为一个整体接受,则去掉空格:

    "-irandom-n2048-d16-c16.txt"
    

    【讨论】:

      【解决方案2】:

      要补充 Kugelman 所说的内容,根据文件的位置,您可能必须使用绝对路径。

      【讨论】:

        【解决方案3】:

        尝试这样的事情,并确保该位置的文本文件,希望它有帮助

        除了手动将 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();
        

        【讨论】:

        • 如果您解释了为什么这会有所帮助,这将是一个更好的答案。此外,所有这些行都可以替换为 processBuilder.inheritIO().
        猜你喜欢
        • 1970-01-01
        • 2019-12-24
        • 2013-04-02
        • 2012-09-20
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多