ProcessBuilder.redirectOutput( myFile) 没有立即更新文件,而是仅在刷新后更新

ProcessBuilder.redirectOutput( myFile) is not updating the file right away but only updating after refresh

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

请帮忙。 这是我用来执行 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();
}

你只给 运行 命令一秒钟,然后你在 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;

添加 try with resources 块将有助于清理打开的流。