Я делаю онлайн-редактор кода для запуска пользовательских кодов только на 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
Ravindra Kumar 24 Июн 2020 в 13:07

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 поможет очистить открытые потоки.

1
DuncG 25 Июн 2020 в 10:59