O exemplo deste artigo descreve a solução para o bloqueio de programas externos chamados por Java baseado em Runtime, que é uma técnica muito prática. Compartilhe com todos para sua referência. A análise específica é a seguinte:
Às vezes, alguns programas externos são chamados em código java, como SwfTools para converter swf, ffmpeg para converter vídeo, etc. Se o seu código for escrito assim: Runtime.getRuntime().exec(command), você descobrirá que o programa é executado imediatamente, mas demora um pouco para ser executado na linha de comando porque Java não espera pela execução do programa externo seja concluído. Você precisa usar o bloqueio para aguardar os resultados da execução do programa externo:
InputStream stderr = process.getInputStream();InputStreamReader isr = new InputStreamReader(stderr, "GBK");BufferedReader br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null ) System.out.println(linha);int exitValue = process.waitFor();
Para programas externos gerais, você pode usar o código de bloqueio acima. Pelo menos não há problema com pdf2swf.exe.
Mas então descobri que para o ffmpeg, o código acima faria com que o programa travasse e outro método precisasse ser usado, encapsulando-o em um método, como segue:
@SuppressWarnings("static-access")public static int doWaitFor(Process process) { InputStream in = null; InputStream err = null; int exitValue = -1; (); err = process.getErrorStream(); boolean terminou = false // Defina como verdadeiro quando p terminar while (!finished) { try { while; (in.available() > 0) { // Imprime a saída da nossa chamada de sistema Character c = new Character((char) in.read()); System.out.print(c } while (err.available()); () > 0) { // Imprime a saída da nossa chamada de sistema Character c = new Character((char) err.read()); // Solicite ao processo seu exitValue. Se o processo // não for concluído, uma IllegalThreadStateException // é lançada. Se for concluída, falhamos e // a variável finalizada é definida como true. terminou ainda; // Durma um pouco para economizar nos ciclos da CPU Thread.currentThread().sleep(500); e.printStackTrace(); finalmente { tentar { if (in!= null) { in.close(); err.close(); } catch (IOException e) { e.printStackTrace();Espero que o que este artigo descreve seja útil para o aprendizado de programação Java para todos.