首页 > 解决方案 > ProcessBuilder.redirectOutput(myFile) 不会立即更新文件,而只会在刷新后更新

问题描述

我正在制作一个在线代码编辑器,以便在 JSP 中仅以 3 种语言(c++、java、python)运行用户键入的代码。所以我通过进程构建器执行命令并将执行的输出存储在文本文件中。但是当时文本文件中的输出没有被更新,但是当我再次提交其他代码或刷新页面时,只有curent输出在输出文本文件中被更新。如何克服这个问题。

请帮忙。这是我用于执行 c++ 程序的代码

File executed_output =new File(path+"C++\\executed_output.txt");
PrintStream o=new PrintStream(executed_output);
List<String>cmd_execute=new ArrayList<String>();

temp=ch+(path+"C++\\code_file.exe")+ch;
cmd_execute.add(temp);
 proc = new ProcessBuilder(cmd_execute)
.redirectErrorStream(true)
.directory(new File(path+"C++\\"))
.redirectErrorStream(true)
.redirectOutput(executed_output )
.start();
 
 proc.getInputStream().close();
proc.getOutputStream().close();

 proc.waitFor(1, TimeUnit.SECONDS);  
 proc.destroy();                     
proc.waitFor(1, TimeUnit.SECONDS);   
proc.destroyForcibly();             
proc.waitFor();


File ff=new File(path+"C++\\executed_output.txt");
FileReader fr=new FileReader(ff); 
BufferedReader br=new BufferedReader(fr);
String ln=br.readLine();  
out.println(ln);
//Scanner scc=new Scanner(ff);
while(ln!=null){
    out.println(ln);
    //out.println(ln);
    ln=br.readLine();
}

标签: javajspprocessbuilder

解决方案


您只给命令一秒钟的运行时间,然后在 waitFor() 之前调用 destroy ,因此删除这些行将使该过程有更多时间完成:

proc.waitFor(1, TimeUnit.SECONDS);  
proc.destroy();                     
proc.waitFor(1, TimeUnit.SECONDS);   
proc.destroyForcibly();

当您使用.redirectErrorStream(true)并将.redirectOutput(executed_output)输出收集到文件时,您也应该删除此行:

proc.getInputStream().close();

如果同一 JSP 有第二次执行,您的文件每次都需要不同,每次调用File.createTemporaryFile()或添加一个 (counter++) 以创建唯一的文件名而不是“executed_output.txt”:

File executed_output =new File(path+"C++\\executed_output.txt")
File ff=executed_output;

使用资源块添加尝试将有助于清理打开的流。


推荐阅读