小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ProcessBuilder 創(chuàng)建操作系統(tǒng)進(jìn)程

 wwq圖書世界 2019-09-25

目錄

ProcessBuilder 概述

方法概述

API 測(cè)試

路徑空格說明


ProcessBuilder 概述

1、public final class java.lang.ProcessBuilder extends Object :此類用于創(chuàng)建操作系統(tǒng)進(jìn)程。 

2、每個(gè) ProcessBuilder 實(shí)例管理一個(gè)進(jìn)程屬性集,start() 方法利用這些屬性創(chuàng)建一個(gè)新的 Process 實(shí)例。start() 方法可以從同一實(shí)例重復(fù)調(diào)用,以利用相同的或相關(guān)的屬性創(chuàng)建新的子進(jìn)程。

3、此類不是同步的,如果多個(gè)線程同時(shí)訪問一個(gè) ProcessBuilder,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了其中一個(gè)屬性,它必須保持外部同步。

4、此類從 JDK 5 開始推出,用于替代之前的 Runtime 類,可以參考《Process 詳解 1》《Runtime 詳解四》

5、注意事項(xiàng):使用 Runtime 時(shí),只要程序和參數(shù)的路徑中沒有空格是可以寫到一個(gè)參數(shù)中的,默認(rèn)按空格分隔;但是ProcessBuilder 設(shè)置程序和參數(shù)必須分開寫,否則報(bào)錯(cuò):“系統(tǒng)找不到指定的文件”。

啟動(dòng)使用默認(rèn)工作目錄和環(huán)境的新進(jìn)程很容易: 

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

構(gòu)造函數(shù)

一共重載了兩個(gè)構(gòu)造函數(shù),一個(gè)參數(shù)是 list,一個(gè)是 array。

public ProcessBuilder (List<String> command)

1)利用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個(gè)進(jìn)程生成器

2)此構(gòu)造方法不會(huì) 制作一份 command 列表的副本 

3)不會(huì)檢查 command 是否為一個(gè)有效的操作系統(tǒng)命令。

4、參數(shù):command - 包含程序及其參數(shù)的列表 ,程序和參數(shù)必須分開寫

5、拋出: NullPointerException - 如果參數(shù)為 null

public ProcessBuilder (String... command)

1、利用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個(gè)進(jìn)程生成器。

2、這是一個(gè)有用的構(gòu)造方法,它將進(jìn)程生成器的命令設(shè)置為與 command 數(shù)組包含相同字符串的字符串列表,且順序相同。

3、不會(huì)檢查 command 是否為一個(gè)有效的操作系統(tǒng)命令。

4、參數(shù):command - 包含程序及其參數(shù)的字符串?dāng)?shù)組,程序和參數(shù)必須分開寫

方法概述

更多 API 可以參考官方文檔:https://docs.oracle.com/javase/8/docs/api/

public Process start() throws IOException

1)使用此進(jìn)程生成器的屬性啟動(dòng)一個(gè)新進(jìn)程

2)此方法檢查命令是否為一條有效的操作系統(tǒng)命令,哪條命令是有效的呢?這取決于系統(tǒng),但至少命令必須是非空字符串的非空列表。 

3)返回:一個(gè)新的 Process 對(duì)象,用于管理子進(jìn)程 

API 測(cè)試

1)啟動(dòng) windows 自帶的計(jì)算器。

1、在 C:/windows/System32 目錄下面,windows 系統(tǒng)自帶了很多應(yīng)用程序,如記事本、計(jì)算器、畫圖、shutdown 等等。

2、下面演示調(diào)用系統(tǒng)程序,不加參數(shù),新開的程序就相當(dāng)于一個(gè)子進(jìn)程。

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.logging.Logger;
  5. /**
  6. * Created by Administrator on 2019/2/26 0026.
  7. */
  8. public class APITest {
  9. private static final Logger logger = Logger.getGlobal();//日志記錄器
  10. public static void main(String[] args) {
  11. try {
  12. List<String> paramList = new ArrayList<>();
  13. //啟動(dòng) windows 的計(jì)算器程序,第一個(gè)參數(shù)必須是可執(zhí)行程序
  14. paramList.add("C:\\Windows\\System32\\calc.exe");
  15. /** 創(chuàng)建ProcessBuilder對(duì)象,設(shè)置指令列表*/
  16. ProcessBuilder processBuilder = new ProcessBuilder(paramList);
  17. logger.info("啟動(dòng)子進(jìn)程...");
  18. Process process = processBuilder.start();
  19. logger.info("子進(jìn)程啟動(dòng)完成...");
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

2)啟動(dòng) Potplayer 播放一個(gè)指定的視頻文件

1、各種安裝的軟件都可以進(jìn)行打開,這里比如安裝好的視頻播放器,我這里安裝的是 PotPlayer 播放器,路徑為:D:\PotPlayer\PotPlayerMini.exe

2、很多程序是支持在 cmd 調(diào)用時(shí)傳遞參數(shù)的,如 chrome.exe 瀏覽器等等,potPlayer 也可以在調(diào)用時(shí)指定參數(shù)。

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.logging.Logger;
  5. /**
  6. * Created by Administrator on 2019/2/26 0026.
  7. */
  8. public class APITest {
  9. private static final Logger logger = Logger.getGlobal();//日志記錄器
  10. public static void main(String[] args) {
  11. try {
  12. List<String> paramList = new ArrayList<>();
  13. //啟動(dòng) windows 上安裝好的 potplayer 播放器,設(shè)置 exe 路徑,路徑必須存在
  14. //第一個(gè)參數(shù)必須是可執(zhí)行程序
  15. paramList.add("D:\\PotPlayer\\PotPlayerMini.exe");
  16. //設(shè)置 potplayer 將要播放的文件,也就是給 potplayer 傳遞的參數(shù),文件必須存在
  17. paramList.add("E:\\Study_Note\\Spring Cloud\\視頻\\第1天\\4 服務(wù)提供者與服務(wù)消費(fèi)者.avi");
  18. /** 創(chuàng)建ProcessBuilder對(duì)象,設(shè)置指令列表*/
  19. ProcessBuilder processBuilder = new ProcessBuilder(paramList);
  20. logger.info("啟動(dòng)子進(jìn)程...");
  21. Process process = processBuilder.start();
  22. logger.info("子進(jìn)程啟動(dòng)完成...");
  23. for (int i = 5; i > 0; i--) {
  24. logger.info((i) + " 秒后結(jié)束子進(jìn)程...");
  25. Thread.sleep(1000);
  26. }
  27. process.destroyForcibly();//強(qiáng)行終結(jié)開啟的子進(jìn)程
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }

然而并不是,所有的子進(jìn)程,都能這么輕易殺死,對(duì)于需要在某些特定時(shí)刻殺死子進(jìn)程的,可以參考:https://blog.csdn.net/wangmx1993328/article/details/80832181#t7 中的“殺死子進(jìn)程 -> 解決方式 2” 部分。

3)使用 cmd 命令 ping 目標(biāo)主機(jī),然后將結(jié)果信息存放在指定文件中。

ping 目標(biāo)主機(jī):屬于 windows 指令,如果自己的電腦和目標(biāo)主機(jī)之間網(wǎng)絡(luò)通暢,則會(huì)返回成功信息,否則返回失敗信息。

  1. import javax.swing.filechooser.FileSystemView;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.logging.Logger;
  7. /**
  8. * Created by Administrator on 2019/2/26 0026.
  9. */
  10. public class APITest {
  11. private static final Logger logger = Logger.getGlobal();//日志記錄器
  12. public static void main(String[] args) throws IOException {
  13. List<String> paramList = new ArrayList<>();
  14. //使用 cmd 命令 ping 遠(yuǎn)程主機(jī)
  15. //第一個(gè)參數(shù)必須是可執(zhí)行程序,cmd也是一個(gè)可執(zhí)行程序,位于 C:/Windows/System32目錄下
  16. paramList.add("cmd");
  17. paramList.add("/c");
  18. paramList.add("ping www.taobao.com");//也可以是ip,如 paramList.add("ping 114.114.114.114");
  19. /** 創(chuàng)建ProcessBuilder對(duì)象,設(shè)置指令列表*/
  20. ProcessBuilder processBuilder = new ProcessBuilder(paramList);
  21. //獲取桌面路徑,如:C:\Users\Administrator.SC-201707281232\Desktop
  22. File desktopFile = FileSystemView.getFileSystemView().getHomeDirectory();
  23. //創(chuàng)建子進(jìn)程輸出信息的存放文件,文件不存在時(shí),會(huì)自動(dòng)創(chuàng)建
  24. File outputFile = new File(desktopFile, "output.txt");
  25. //返回此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目標(biāo),意思是將來輸出信息全部放在這個(gè)目標(biāo)中
  26. processBuilder = processBuilder.redirectOutput(outputFile);
  27. processBuilder.start();//啟動(dòng)進(jìn)程構(gòu)建器
  28. logger.info("子進(jìn)程執(zhí)行消息存放在:" + processBuilder.redirectOutput().file().getPath());
  29. }
  30. }

4)directory(File directory)  設(shè)置此進(jìn)程構(gòu)建器的工作目錄,注意它是為參數(shù)列表中程序參數(shù)設(shè)置工作目錄,而不是程序的工作目錄,下面通過實(shí)例理解。

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.logging.Logger;
  6. /**
  7. * Created by Administrator on 2019/2/26 0026.
  8. */
  9. public class APITest {
  10. private static final Logger logger = Logger.getGlobal();//日志記錄器
  11. public static void main(String[] args) throws IOException {
  12. List<String> paramList = new ArrayList<>();
  13. paramList.add("C:/windows/system32/notepad.exe");//啟動(dòng)系統(tǒng)的記事本,第一個(gè)參數(shù)必須是可執(zhí)行程序
  14. //打開 E:/wmx/test/123.txt 文件,文件必須存在
  15. //應(yīng)該在 start 之前切換工作目錄到 E:/wmx/test
  16. paramList.add("123.txt");
  17. ProcessBuilder pb = new ProcessBuilder(paramList);
  18. //切換進(jìn)程構(gòu)建器的工作目錄到 E:/wmx/test 下,這樣上面才能簡(jiǎn)寫 123.txt時(shí)找到文件
  19. //必須注意的是 directory 是為paramList中的參數(shù) "123.txt" 設(shè)置的工作目錄,,而不是程序 "C:/windows/system32/notepad.exe"
  20. //程序要么就是寫全路徑,要么就是配置系統(tǒng)環(huán)境變量才能寫簡(jiǎn)稱,如 calc、notepad 等
  21. pb.directory(new File("E:/wmx/test/"));
  22. pb.start();//開啟子進(jìn)程
  23. logger.info(pb.directory() + ":當(dāng)前工作目錄");//默認(rèn)情況下,未設(shè)置時(shí),輸出為 null
  24. }
  25. }

路徑空格說明

1)如下使用 Office 的 Word.exe 打開一個(gè) docx 文件,Word.exe 與 .docx 文件路徑有空格都是可以的,Word.exe 與 .docx 分別占一個(gè)元素:

正確:[cmd, /c, C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE, E:\wmx\MR軟件說明書.docx]

2)如下使用 PotPlayer 播放一個(gè) mp4文件,mp4文件路徑含有空格,可以將空格路徑作為一個(gè)元素,也可以將路徑空格位置切分為多個(gè)元素:
正確:[cmd, /c, D:\PotPlayer\PotPlayerMini.exe, E:\wmx\w s\sh k\8.mp4]
正確:[cmd, /c, D:\PotPlayer\PotPlayerMini.exe, E:\wmx\w, s\sh, k\8.mp4]

3)如下的本意是想讓 Chrome 瀏覽器全屏模式打開一個(gè)地址,因?yàn)?--kiosk 與后面的瀏覽器地址一共是兩個(gè)參數(shù),所以寫法一正確,寫法二錯(cuò)誤。

正確:[cmd, /c, C:/Program Files (x86)/Google/Chrome/Application/chrome.exe, --kiosk, http://www.baidu.com]
錯(cuò)誤:[cmd, /c, C:/Program Files (x86)/Google/Chrome/Application/chrome.exe, --kiosk http://www.baidu.com]

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多