يصف المثال الموجود في هذه المقالة الحل لحظر البرامج الخارجية التي تستدعيها Java استنادًا إلى Runtime، وهي تقنية عملية للغاية. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
في بعض الأحيان يتم استدعاء بعض البرامج الخارجية بلغة Java البرمجية، مثل SwfTools لتحويل swf، وffmpeg لتحويل الفيديو، وما إلى ذلك. إذا كانت التعليمات البرمجية الخاصة بك مكتوبة على النحو التالي: Runtime.getRuntime().exec(command)، فستجد أن البرنامج يتم تنفيذه على الفور، ولكنه يستغرق بعض الوقت للتنفيذ في سطر الأوامر لأن Java لا تنتظر تنفيذ الأمر. لإكمال البرنامج الخارجي، تحتاج إلى استخدام الحظر لانتظار نتائج تنفيذ البرنامج الخارجي:
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);intexitValue =process.waitFor();
بالنسبة للبرامج الخارجية العامة، يمكنك استخدام رمز الحظر المذكور أعلاه، على الأقل لا توجد مشكلة في ملف pdf2swf.exe.
ولكن بعد ذلك اكتشفت أنه بالنسبة لـ ffmpeg، فإن الكود أعلاه قد يتسبب في توقف البرنامج، ويجب استخدام طريقة أخرى، وتغليفها في طريقة، كما يلي:
@SuppressWarnings("static-access")public static int doWaitFor(Processprocess) { InputStream in = null; InputStream err = null; (); err =process.getErrorStream(); boolean Finish = false; (in.available() > 0) { // طباعة مخرجات استدعاء نظامنا Character c = new Character((char) in.read()); System.out.print(c); () > 0) { // اطبع مخرجات استدعاء نظامنا Character c = new Character((char) err.read()); System.out.print(c); إذا لم تنتهي العملية //، تم طرح IllegalThreadStateException // إذا تم الانتهاء منه، ويتم تعيين المتغير النهائي على true انتهى بعد // نام قليلاً لتوفير دورات وحدة المعالجة المركزية Thread.currentThread().sleep(500); e.printStackTrace(); } أخيرًا { حاول { if (in != null) { in. Close() } } Catch (IOException e) { e.printStackTrace() } if (err != null) { حاول { err.Close(); }catch (IOException e) { e.printStackTrace();آمل أن يكون ما تصفه هذه المقالة مفيدًا للجميع في تعلم برمجة Java.