使用 Ubuntu 14.04 LTS 时,同样的事情在终端上有效,但在 Java 运行时无效

使用 Ubuntu 14.04 LTS 时,同样的事情在终端上有效,但在 Java 运行时无效

我有一个在 Windows 上开发的 Java 项目。现在,我想让它独立于平台。

项目的一部分是:它采用一个程序并执行。从文件获取输入并在文件中给出输出,然后将输出文件与另一个文件进行比较并给出结果。

首先,我有一个运行.cpp文件并生成可执行文件的类。据我所知,这项工作的命令在 Windows 和 Ubuntu 中是相同的,即:

g++ -std=c++11 -o <name of executable file> <path of .cpp file>

使用上述命令,它在终端上运行良好。但在代码中实现同样的事情时,它会出现编译错误。这意味着以下错误:

g++: fatal error: no input files

看图更清楚:

在此处输入图片描述

我的代码:

package judgecpp;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.nio.file.Paths;

class CodeCompile implements Runnable, RunInCmd {

    Thread compilerThread;
    private final File fileCPP;
    
    public File file;
    public boolean errorHas;

    public CodeCompile(File fileCPP) {
        this.fileCPP = fileCPP;

        file = new File(String.format("compiledFile%d", CodeProcessing.getNewFileNumber()));
        compilerThread = new Thread(this, "compilerThread");
    }

    @Override
    public Process cmdRun(String command) throws IOException {
        Runtime rt;
        Process pr;
        rt = Runtime.getRuntime();
        pr = rt.exec(command);
        return pr;
    }

    @Override
    public void run() {

        try {
            String command = String.format("g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"");
//            if(VerdictGiver.os.equals("uni")) command = String.format("g++ -std=c++11 \"" + fileCPP.toString() + "\" -o \"" + file.toString() + "\"");
//            command = "pwd";
            System.out.println("Code Compile: "+command);
            System.out.println("OS: "+VerdictGiver.os);
            Process pr = cmdRun(command);
            Path currentRelativePath = Paths.get("");
            String s = currentRelativePath.toAbsolutePath().toString();
            System.out.println("Current relative path is: " + s);
            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
            
            errorHas = false;
            System.out.println("Compile Error Stream starts -----------------------------------------");
            while (input.readLine() != null) {
                System.out.println(input.readLine());
                errorHas = true;
            }
            System.out.println("Compile Error Stream ends -------------------------------------------");
        } catch (IOException ex) {
//            Logger.getLogger(CodeCompile.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

我在这里堆放已久。

更新:

我找到了解决方案,但不知道它为什么有效。下面这行代码可以替代:

String command = String.format("g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"");

我使用了以下行:

String command = String.format("cmd /c \"g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"\"");

这意味着生成的字符串将如下所示:

cmd /c "g++ -std=c++11 -o "compiledFile0" "Submissions/20_masd_0_2015_09_14_01_09_58.cpp""

但是在运行程序时,以下字符串均不起作用:

在此处输入图片描述

首先(这个在终端上运行良好):

"./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"

第二:

cmd /c ""./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""

第三:

cmd /c ""compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""

第四:

"compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"

但这次没有运气,需要帮助。

相关内容