首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >runtime.getruntime.exec不识别可执行文件

runtime.getruntime.exec不识别可执行文件
EN

Stack Overflow用户
提问于 2018-05-02 04:44:02
回答 1查看 329关注 0票数 1

我使用Runtime.getRuntime().exec()方法运行'optimathsat.exe‘文件。我的代码就像

代码语言:javascript
复制
public boolean runOptimathSat() throws InterruptedException {
    boolean runSucceed = false;
    smtInputFileDirectory = getInputDirectory();
    txtOutputFileDirectory = getOutputDirectory();
    optimathsatDirectory = getOptimathSatDirectory();
    if ((smtInputFileDirectory != null) && (txtOutputFileDirectory != null)
            && (optimathsatDirectory != null)) {

        if (isWindows()) {
            String winCommand;
            winCommand = "cmd /c cd " + optimathsatDirectory + " && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < " + smtInputFileDirectory + " > " + txtOutputFileDirectory + " 2>& 1";
            System.err.println("COMMAND: "+winCommand);
            try {
                Process p = Runtime.getRuntime().exec(winCommand);
                p.waitFor();
                runSucceed = true;  
            } catch (IOException e) {
                e.printStackTrace();
            }
    return runSucceed;}

运行此代码后,它将在控制台中显示下面一行

代码语言:javascript
复制
COMMAND: cmd /c cd "C:\Users\Karencom\OptiMathSAT\optimathsat-1.5.1-windows-64-bit-mingw\bin" && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < "C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/bibi.smt2" > "C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/bibi.txt" 2>& 1

并在下面显示了bibi.txt文件中的错误

代码语言:javascript
复制
'optimathsat.exe' is not recognized as an internal or external command, operable program or batch file.

但是,当我在一个单独的项目(只有一个类)中复制上述代码的一些行并替换winCommand变量中生成的命令时,它工作得很好。

代码语言:javascript
复制
import java.io.IOException;
public class Test {
public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
    try {
        String winCommand="cmd /c cd"+ " \"C:\\Users\\Karencom\\OptiMathSAT\\optimathsat-1.5.1-windows-64-bit-mingw\\bin\" && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < \"C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/sensen.smt2\" > \"C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/sensen.txt\" 2>& 1";
        Process p = Runtime.getRuntime().exec(winCommand);
        p.waitFor();    
        System.err.println("COMMAND: "+winCommand);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

我想第一个项目的配置是不正确的,但我不知道如何解决它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-02 05:02:30

您正在使用cmd做两件事:

  • 设置当前目录
  • 重定向输入输出

与其使用cmd,不如使用Java的ProcessBuilder

代码语言:javascript
复制
String[] winCommand = {
        "optimathsat.exe",
        "-opt.print_objectives=True",
        "-opt.output_format=old",
        "-optimization.card_constr_encoding=2",
        "-optimization.dpll.search_strategy=1",
        "-preprocessor.toplevel_propagation=False",
        "-preprocessor.simplification=0"
};
Process p = new ProcessBuilder(winCommand)
        .directory(new File(optimathsatDirectory))        // "cd " + optimathsatDirectory
        .redirectInput(new File(smtInputFileDirectory))   // "< " + smtInputFileDirectory
        .redirectOutput(new File(txtOutputFileDirectory)) // "> " + txtOutputFileDirectory
        .redirectErrorStream(true)                        // 2>& 1
        .start();
p.waitFor();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50127296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档