כיצד להריץ פקודת מעטפת בג'אווה

1. סקירה כללית

בעזרת הדרכה זו נמחיש את שתי הדרכים של ביצוע פקודת מעטפת מבפנים ג'אווה קוד.

הראשון הוא להשתמש ב- זמן ריצה בכיתה וקראו לה ביצוע שיטה.

הדרך השנייה והניתנת להתאמה אישית יותר היא ליצור ולהשתמש ב- ProcessBuilder למשל.

2. תלות במערכת ההפעלה

לפני שאנחנו הולכים ליצור חדש תהליך ביצוע פקודת הפגז שלנו, ראשית עלינו לקבוע את מערכת ההפעלה עליה שלנו JVM רץ.

זה בגלל, הלאה חלונות, עלינו להריץ את הפקודה שלנו כטענה ל cmd.exe מעטפת ובכל מערכות הפעלה אחרות אנו יכולים להנפיק מעטפת רגילה, הנקראת sh:

isWindows בוליאני = System.getProperty ("os.name") .toLowerCase (). startsWith ("windows");

3. קלט ופלט

יתר על כןאנו זקוקים לדרך להתחבר לזרמי הקלט והפלט של התהליך שלנו.

לפחות את הפלט יש לצרוך - אחרת התהליך שלנו לא חוזר בהצלחה, אלא הוא יתלה.

בואו נשתמש בכיתה נפוצה הנקראת StreamGobbler שצורכת InputStream:

מחלקה סטטית פרטית StreamGobbler מיישמת Runnable {private InputStream inputStream; צרכן צרכני פרטי; StreamGobbler ציבורי (InputStream inputStream, צרכן צרכני) {this.inputStream = inputStream; this.consumer = צרכן; } @Override הפעלה בטלנית ציבורית () {BufferedReader חדש (InputStreamReader חדש (inputStream)). שורות () .forEach (צרכן); }}

הערה: כיתה זו מיישמת את ניתן לרוץ ממשק, מה שאומר שהוא יכול להתבצע על ידי כל אחד מהם מוציא להורג.

4. Runtime.exec ()

שיטת קריאה ל Runtime.exec () היא דרך פשוטה, שעדיין לא ניתנת להתאמה אישית, להוליד תהליך משנה חדש.

בדוגמה הבאה נבקש רישום ספריות של ספריה ביתית של משתמשים והדפסה למסוף:

מחרוזת homeDirectory = System.getProperty ("user.home"); תהליך תהליך; אם (isWindows) {process = Runtime.getRuntime () .exec (String.format ("cmd.exe / c dir% s", homeDirectory)); } אחר {process = Runtime.getRuntime () .exec (String.format ("sh -c ls% s", homeDirectory)); } StreamGobbler streamGobbler = StreamGobbler חדש (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Submit (streamGobbler); int exitCode = process.waitFor (); לטעון exitCode == 0;

5. ProcessBuilder

לצורך היישום השני של בעיית המחשוב שלנו, נשתמש ב- ProcessBuilder. זה עדיף על פני זמן ריצה גישה מכיוון שאנחנו יכולים להתאים אישית כמה פרטים.

לדוגמא אנו מסוגלים:

  • שנה את ספריית העבודה שבה פקודת הפגז שלנו פועלת builder.directory ()
  • הגדרת מפת ערכי מפתח מותאמת אישית כסביבה באמצעות builder.environment ()
  • להפנות זרמי קלט ופלט להחלפות מותאמות אישית
  • לרשת את שניהם לזרמי הזרם JVM תהליך באמצעות builder.inheritIO ()
Builder ProcessBuilder = ProcessBuilder חדש (); אם (isWindows) {builder.command ("cmd.exe", "/ c", "dir"); } אחר {builder.command ("sh", "-c", "ls"); } builder.directory (קובץ חדש (System.getProperty ("user.home"))); תהליך תהליך = builder.start (); StreamGobbler streamGobbler = StreamGobbler חדש (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Submit (streamGobbler); int exitCode = process.waitFor (); לטעון exitCode == 0;

6. מסקנה

כפי שראינו במדריך מהיר זה, אנו יכולים לבצע פקודת מעטפת ב ג'אווה בשתי דרכים מובחנות.

באופן כללי, אם אתם מתכננים להתאים אישית את הביצוע של התהליך שהוליד, למשל, כדי לשנות את ספריית העבודה שלו, עליכם לשקול להשתמש ב ProcessBuilder.

כמו תמיד, תוכלו למצוא את המקורות ב- GitHub.