<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java `ProcessBuilder`教程 原文:http://zetcode.com/java/processbuilder/ Java `ProcessBuilder`教程顯示了如何使用`ProcessBuilder`創建操作系統進程。 ## `ProcessBuilder` `ProcessBuilder`用于創建操作系統進程。 其`start()`方法創建具有以下屬性的新`Process`實例: * 命令 * 環境 * 工作目錄 * 輸入來源 * 標準輸出和標準錯誤輸出的目標 * `redirectErrorStream` ## `ProcessBuilder`運行程序 用`command()`執行程序。 使用`waitFor()`,我們可以等待過程完成。 `ExecuteProgram.java` ```java package com.zetcode; import java.io.IOException; public class ExecuteProgram { public static void main(String[] args) throws IOException, InterruptedException { var processBuilder = new ProcessBuilder(); processBuilder.command("notepad.exe"); var process = processBuilder.start(); var ret = process.waitFor(); System.out.printf("Program exited with code: %d", ret); } } ``` 該程序執行 Windows 記事本應用。 它返回其退出代碼。 ## `ProcessBuilder`命令輸出 以下示例執行命令并顯示其輸出。 `ProcessBuilderEx.java` ```java package com.zetcode; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ProcessBuilderEx { public static void main(String[] args) throws IOException { var processBuilder = new ProcessBuilder(); processBuilder.command("cal", "2019", "-m 2"); var process = processBuilder.start(); try (var reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } } } ``` 該示例運行 Linux `cal`命令。 ```java processBuilder.command("cal", "2019", "-m 2"); ``` `command()`執行`cal`程序。 其他參數是程序的選項。 為了在 Windows 機器上運行命令,我們可以使用以下命令:`processBuilder.command("cmd.exe", "/c", "ping -n 3 google.com")`。 ```java var process = processBuilder.start(); ``` `start()`啟動了該過程。 ```java try (var reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { ``` 使用`getInputStream()`方法,我們從流程的標準輸出中獲取輸入流。 ```java February 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ``` 這是輸出。 ## `ProcessBuilder`重定向輸出 使用`redirectOutput()`,我們可以重定向流程構建器的標準輸出目的地。 `RedirectOutputEx.java` ```java package com.zetcode; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; public class RedirectOutputEx { public static void main(String[] args) throws IOException { var homeDir = System.getProperty("user.home"); var processBuilder = new ProcessBuilder(); processBuilder.command("cmd.exe", "/c", "date /t"); var fileName = new File(String.format("%s/Documents/tmp/output.txt", homeDir)); processBuilder.redirectOutput(fileName); var process = processBuilder.start(); try (var reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } } } ``` 該程序將構建器的輸出重定向到文件。 它運行 Windows `date`命令。 ```java processBuilder.redirectOutput(fileName); ``` 我們將流程構建器的標準輸出重定向到文件。 ```java try (var reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } ``` 現在輸出到文件。 ```java $ echo %cd% C:\Users\Jano\Documents\tmp $ more output.txt Thu 02/14/2019 ``` 當前日期已寫入`output.txt`文件。 ## `ProcessBuilder`重定向輸入和輸出 下一個示例同時重定向輸入和輸出。 `src/resources/input.txt` ```java sky blue steel morning coffee earth forest ``` 這是`input.txt`文件的內容。 `ProcessBuilderRedirectIOEx.java` ```java package com.zetcode; import java.io.File; import java.io.IOException; public class ProcessBuilderRedirectIOEx { public static void main(String[] args) throws IOException { var processBuilder = new ProcessBuilder(); processBuilder.command("cat") .redirectInput(new File("src/resources", "input.txt")) .redirectOutput(new File("src/resources/", "output.txt")) .start(); } } ``` 在程序中,我們將輸入從`input.txt`文件重定向到`cat`命令,并將命令的輸出重定向到`output.txt`文件。 ## `ProcessBuilder`繼承 IO `inheritIO()`將子流程標準 I/O 的源和目的地設置為與當前 Java 流程相同。 `ProcessBuilderInheritIOEx.java` ```java package com.zetcode; import java.io.IOException; public class ProcessBuilderInheritIOEx { public static void main(String[] args) throws IOException, InterruptedException { var processBuilder = new ProcessBuilder(); processBuilder.command("cmd.exe", "/c", "dir"); var process = processBuilder.inheritIO().start(); int exitCode = process.waitFor(); System.out.printf("Program ended with exitCode %d", exitCode); } } ``` 通過繼承已執行命令的 IO,我們可以跳過讀取步驟。 程序輸出項目目錄的內容和顯示退出代碼的消息。 ```java 02/14/2019 04:55 PM <DIR> . 02/14/2019 04:55 PM <DIR> .. 02/19/2019 01:11 PM <DIR> .idea 02/14/2019 04:55 PM <DIR> out 02/14/2019 04:52 PM 433 ProcessBuilderInheritIOEx.iml 02/14/2019 04:53 PM <DIR> src 1 File(s) 433 bytes 5 Dir(s) 157,350,264,832 bytes free Program ended with exitCode 0 ``` 我們同時獲得執行的命令和自己的 Java 程序的輸出。 ## `ProcessBuilder`環境 `environment()`方法返回流程構建器環境的字符串映射視圖。 `ProcessBuilderEnvEx.java` ```java package com.zetcode; public class ProcessBuilderEnvEx { public static void main(String[] args) { var pb = new ProcessBuilder(); var env = pb.environment(); env.forEach((s, s2) -> { System.out.printf("%s %s %n", s, s2); }); System.out.printf("%s %n", env.get("PATH")); } } ``` 該程序顯示所有環境變量。 ```java configsetroot C:\WINDOWS\ConfigSetRoot USERDOMAIN_ROAMINGPROFILE LAPTOP-OBKOFV9J LOCALAPPDATA C:\Users\Jano\AppData\Local PROCESSOR_LEVEL 6 USERDOMAIN LAPTOP-OBKOFV9J LOGONSERVER \\LAPTOP-OBKOFV9J JAVA_HOME C:\Users\Jano\AppData\Local\Programs\Java\openjdk-11\ SESSIONNAME Console ... ``` 這是 Windows 上的示例輸出。 在下一個程序中,我們定義一個自定義環境變量。 `ProcessBuilderEnvEx2.java` ```java package com.zetcode; import java.io.IOException; public class ProcessBuilderEnvEx2 { public static void main(String[] args) throws IOException { var pb = new ProcessBuilder(); var env = pb.environment(); env.put("mode", "development"); pb.command("cmd.exe", "/c", "echo", "%mode%"); pb.inheritIO().start(); } } ``` 該程序定義一個`mode`變量并在 Windows 上輸出。 ```java pb.command("cmd.exe", "/c", "echo", "%mode%"); ``` `%mode%`是 Windows 的環境變量語法; 在 Linux 上,我們使用`$mode`。 ## `ProcessBuilder`目錄 `directory()`方法設置流程構建器的工作目錄。 `ProcessBuilderDirectoryEx.java` ```java package com.zetcode; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; public class ProcessBuilderDirectoryEx { public static void main(String[] args) throws IOException { var homeDir = System.getProperty("user.home"); var pb = new ProcessBuilder(); pb.command("cmd.exe", "/c", "dir"); pb.directory(new File(homeDir)); var process = pb.start(); try (var reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } } } ``` 該示例將主目錄設置為流程生成器的當前目錄。 我們顯示主目錄的內容。 ```java var homeDir = System.getProperty("user.home"); ``` 我們得到用戶的主目錄。 ```java pb.command("cmd.exe", "/c", "dir"); ``` 我們定義了一個在 Windows 上執行`dir`程序的命令。 ```java pb.directory(new File(homeDir)); ``` 我們設置流程構建器的目錄。 ```java Volume in drive C is Windows Volume Serial Number is 4415-13BB Directory of C:\Users\Jano 02/14/2019 11:48 AM <DIR> . 02/14/2019 11:48 AM <DIR> .. 10/13/2018 08:38 AM <DIR> .android 01/31/2019 10:58 PM 281 .bash_history 12/17/2018 03:02 PM <DIR> .config ... ``` 這是一個示例輸出。 ## `ProcessBuilder`非阻塞操作 在下面的示例中,我們創建一個異步過程。 `ProcessBuilderNonBlockingEx.java` ```java package com.zetcode; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; public class ProcessBuilderNonBlockingEx { public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException, IOException { var executor = Executors.newSingleThreadExecutor(); var processBuilder = new ProcessBuilder(); processBuilder.command("cmd.exe", "/c", "ping -n 3 google.com"); try { var process = processBuilder.start(); System.out.println("processing ping command ..."); var task = new ProcessTask(process.getInputStream()); Future<List<String>> future = executor.submit(task); // non-blocking, doing other tasks System.out.println("doing task1 ..."); System.out.println("doing task2 ..."); var results = future.get(5, TimeUnit.SECONDS); for (String res : results) { System.out.println(res); } } finally { executor.shutdown(); } } private static class ProcessTask implements Callable<List<String>> { private InputStream inputStream; public ProcessTask(InputStream inputStream) { this.inputStream = inputStream; } @Override public List<String> call() { return new BufferedReader(new InputStreamReader(inputStream)) .lines() .collect(Collectors.toList()); } } } ``` 該程序創建一個在控制臺上運行`ping`命令的進程。 它在`Executors.newSingleThreadExecutor()`方法的幫助下在單獨的線程中執行。 ```java processing ping command ... doing task1 ... doing task2 ... Pinging google.com [2a00:1450:4001:825::200e] with 32 bytes of data: Reply from 2a00:1450:4001:825::200e: time=108ms Reply from 2a00:1450:4001:825::200e: time=111ms Reply from 2a00:1450:4001:825::200e: time=112ms Ping statistics for 2a00:1450:4001:825::200e: Packets: Sent = 3, Received = 3, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 108ms, Maximum = 112ms, Average = 110ms ``` 這是輸出。 ## `ProcessBuilder`管道操作 管道是一種用于將信息從一個程序進程傳遞到另一個程序進程的技術。 `ProcessBuilderPipeEx.java` ```java package com.zetcode; import java.io.File; import java.io.IOException; public class ProcessBuilderPipeEx { public static void main(String[] args) throws IOException { var homeDir = System.getProperty("user.home"); var processBuilder = new ProcessBuilder(); processBuilder.command("cmd.exe", "/c", "dir | grep [dD]o"); processBuilder.directory(new File(homeDir)); processBuilder.inheritIO().start(); } } ``` 該示例通過管道(|)將信息從`dir`命令發送到`grep`命令。 ```java Volume in drive C is Windows 11/14/2018 06:57 PM <DIR> .dotnet 02/18/2019 10:54 PM <DIR> Documents 02/17/2019 01:11 AM <DIR> Downloads ``` 這是輸出。 在本教程中,我們使用 Java 的`ProcessBuilder`執行 OS 進程。 您可能也對相關教程感興趣: [Java `Files.walk`教程](/java/fileswalk/)和 [Java 教程](/lang/java/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看