Я делаю онлайн-редактор кода для запуска пользовательских кодов только на 3 языках (c ++, java, python) в JSP. Итак, я выполняю команду через построитель процессов и сохраняю результат выполнения в текстовом файле. Но вывод в текстовом файле в это время не обновляется, но когда я снова отправляю другой код или обновляю страницу, в выходном текстовом файле обновляется только вывод лекарств. Как побороть эту проблему.
Пожалуйста помоги. Вот код, который я использую для выполнения программ на 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();
}
1 ответ
Вы даете команде только одну секунду для запуска, а затем вы вызываете уничтожение перед waitFor (), поэтому удаление этих строк даст процессу больше времени для завершения:
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 ++), чтобы сделать уникальное имя файла вместо "execute_output.txt" каждый раз:
File executed_output =new File(path+"C++\\executed_output.txt")
File ff=executed_output;
Добавление блока try with resources поможет очистить открытые потоки.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.