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 块将有助于清理打开的流。
我正在制作在线代码编辑器,以便 运行 用户在 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 块将有助于清理打开的流。