当我从 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);
...
}
我正在创建一个 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);
...
}