Пример в этой статье описывает решение проблемы блокировки внешних программ, вызываемых Java, на основе Runtime, что является очень практичным методом. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
Иногда в Java-коде вызываются некоторые внешние программы, например SwfTools для конвертации SWF, ffmpeg для конвертации видео и т.д. Если ваш код написан так: Runtime.getRuntime().exec(команда), вы обнаружите, что программа выполняется немедленно, но выполнение в командной строке занимает некоторое время, поскольку Java не ждет выполнения команды. внешняя программа для завершения. Вам нужно использовать блокировку, чтобы дождаться результатов выполнения внешней программы:
InputStream stderr =process.getInputStream();InputStreamReader isr = новый InputStreamReader(stderr, "GBK");BufferedReader br = new BufferedReader(isr);String line = null; while ((line = br.readLine()) != null ) System.out.println(line);int exitValue =process.waitFor();
Для обычных внешних программ вы можете использовать приведенный выше код блокировки. По крайней мере, с pdf2swf.exe проблем нет.
Но затем я обнаружил, что для ffmpeg приведенный выше код может привести к зависанию программы, и необходимо использовать другой метод, инкапсулируя его в метод, следующим образом:
@SuppressWarnings("static-access") public static int doWaitFor(Processprocess) { InputStream in = null; (); err =process.getErrorStream(); boolean Finished = false // Устанавливается в значение true, когда p завершается while (!finished) { try { while; (in.available() > 0) { // Распечатываем вывод нашего системного вызова. Символ c = новый символ((char) in.read()); System.out.print(c } while (err.available); () > 0) { // Распечатываем вывод нашего системного вызова. Символ c = new Символ((char) err.read()); System.out.print(c); // Запрашиваем у процесса значение выхода. Если процесс // не завершен, // выдается исключение IllegalThreadStateException. Если оно завершено, мы проваливаемся, и // переменной Finish присваивается значение true. закончено // Немного поспать, чтобы сэкономить ресурсы процессора Thread.currentThread().sleep(500); } } } catch (Exception e) { e.printStackTrace(); } наконец { try { if (in != null) { in.close() } } catch (IOException e) { e.printStackTrace() } if (err != null) { try { err.close(); } catch (IOException e) { e.printStackTrace() } } return exitValue;};Я надеюсь, что описание этой статьи будет полезно каждому при изучении программирования на Java.