java - 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();
}
解决方案
您只给命令一秒钟的运行时间,然后在 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;
使用资源块添加尝试将有助于清理打开的流。
推荐阅读
- flutter - 零件和出口 - 飞镖的用途是什么?
- javascript - 选择状态中存在的网页上的元素
- r - 在 for 循环中集中字符串
- node.js - 将 node.js 应用程序部署到 heroku 时出错
- firebase - 为什么计算属性在我的 Vue 3 应用程序中没有反应性?
- android - 有没有办法在 Android Studio 中仍然使用低于 26 的 API 作为目标 SDK
- db2 - 在 DR 活动的情况下使用 Hikari 池和 DB2 ACR
- sql-server - SSIS Flat File source-摆脱一些嵌入的不需要的双引号
- angular - 使用从头开始的时刻以角度显示日历的周视图
- openshift - 以用户身份更改 oc 登录密码