L'exemple de cet article décrit la solution au blocage des programmes externes appelés par Java basée sur le Runtime, ce qui est une technique très pratique. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
Parfois, certains programmes externes sont appelés en code Java, comme SwfTools pour convertir des swf, ffmpeg pour convertir des vidéos, etc. Si votre code est écrit comme ceci : Runtime.getRuntime().exec(command), vous constaterez que le programme est exécuté immédiatement, mais son exécution prend un certain temps sur la ligne de commande car Java n'attend pas l'exécution du programme externe pour terminer. Vous devez utiliser le blocage pour attendre les résultats de l'exécution du programme externe :
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(line);int exitValue = process.waitFor();
Pour les programmes externes généraux, vous pouvez utiliser le code de blocage ci-dessus. Au moins, il n'y a aucun problème avec pdf2swf.exe.
Mais ensuite, j'ai découvert que pour ffmpeg, le code ci-dessus provoquerait le blocage du programme et qu'une autre méthode devait être utilisée, en l'encapsulant dans une méthode, comme suit :
@SuppressWarnings("static-access")public static int doWaitFor(Processus) { InputStream in = null; InputStream err = null; int exitValue = -1; // renvoyé à l'appelant lorsque p est terminé try { in = process.getInputStream (); err = process.getErrorStream(); booleanfinished = false; // Mis à true lorsque p est terminé while (!finished) { try { while (in.available() > 0) { // Imprimer la sortie de notre appel système Character c = new Character((char) in.read()); System.out.print(c } while (err.available); () > 0) { // Imprimer la sortie de notre appel système Character c = new Character((char) err.read()); System.out.print(c); } // Demander au processus sa valeur de sortie. Si le processus // n'est pas terminé, une IllegalThreadStateException // est levée. Si elle est terminée, nous échouons et // la variable finish est définie sur true. terminé ; // Dormez un peu pour économiser les cycles du processeur Thread.currentThread().sleep(500); e.printStackTrace(); } enfin { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace( } if (err != null) { try { err.close(); } catch (IOException e) { e.printStackTrace(); } } } return exitValue;}J'espère que ce que décrit cet article sera utile à l'apprentissage de la programmation Java par chacun.