当我从 cmd 重定向输出时,为什么我得到的输出文件为空?

Why am I getting the output file as empty when I am redirecting the output from cmd?

我正在创建一个 JAVA Web 应用程序来在线判断代码。我正在获取用户上传的 .java 文件并将其存储在 C:\uploads 中。然后使用 ProcessBuilder class,我在服务器上编译并执行 java 文件。执行时,我将 JAVA 程序的输出重定向到 output.txt。 该程序编译正常。但是出现的问题是在执行时,尽管创建了 output.txt 文件,但该文件是空的。

执行代码如下

public static boolean executeCode(int timeLimit,String fileName)
{
    fileName=fileName.substring(0,fileName.length()-5);  //to remove .java
    String commands[]={"CMD", "/C","cd C:\uploads && java"+fileName+">output.txt"};
    ProcessBuilder p=new ProcessBuilder(commands);
    p.redirectErrorStream(true);
    Process process=null;
    boolean errCode=false;
    try {
        long start=System.nanoTime();
        process=p.start();
         errCode=process.waitFor(timeLimit,TimeUnit.MILLISECONDS); 
         long end=System.nanoTime();
         System.out.println("Duration="+(end-start));
        } catch (IOException e) {
        e.printStackTrace();
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
    return errCode;
}

P.S。 - 当我只创建一个 JAVA 程序来做同样的事情时,这个问题没有发生。

我不是高级 console/bash 用户,但您是不是漏掉了几个空格?该行应该是这样的:

String commands[]={"CMD", "/C","cd C:\uploads && java "+fileName+" > output.txt"};

如果您使用的是 jdk 1.7,那么您可以尝试这样的操作:

public static boolean executeCode(int timeLimit,String fileName)
{
    String commands[]={"CMD", "/C","cd C:\uploads && javac " + fileName};
    ProcessBuilder p=new ProcessBuilder(commands);
    p.redirectErrorStream(true);

    File output = new File("C:\uploads\output.txt");
    p.redirectOutput(output);

    ...

}