成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java調(diào)用WMIC命令的方法阻塞

開發(fā) 后端
今天要寫個(gè)遠(yuǎn)程重啟服務(wù)的功能,為了開發(fā)速度,暫時(shí)定為Java代碼+WMIC命令的方法,簡單的說,就是利用Java調(diào)用本機(jī)應(yīng)用程序的方法。涉及到的Java類有java.lang包里面的Runtime、Process、ProcessBuilder三個(gè)類,以及wmic中重啟服務(wù)的命令。

今天要寫個(gè)遠(yuǎn)程重啟服務(wù)的功能,為了開發(fā)速度,暫時(shí)定為Java代碼+WMIC命令的方法,簡單的說,就是利用Java調(diào)用本機(jī)應(yīng)用程序的方法。涉及到的Java類有java.lang包里面的Runtime、Process、ProcessBuilder三個(gè)類,以及wmic中重啟服務(wù)的命令。因?yàn)橹耙矊戇^這方面的東西,所以很習(xí)慣性的寫出了代碼:

  1. Process p = Runtime.getRuntime().exec("wmic ...");  
  2. BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  
  3. String tmp = null;  
  4.  
  5. while ((tmp = br.readline()) != null) {  
  6.     System.out.println(tmp);  
  7. }  
  8. int exitValue = p.waitfor(); 

運(yùn)行,結(jié)果發(fā)現(xiàn)程序不能退出,Debug發(fā)現(xiàn)程序阻塞在br.readline()中了,強(qiáng)制結(jié)束程序,發(fā)現(xiàn)重啟服務(wù)的命令正常下下去了,去掉程序中獲得標(biāo)準(zhǔn)輸出的地方和獲得返回結(jié)果的地方,命令也能正常下去,而且正常退出。

為什么程序會阻塞呢?Google了一下,發(fā)現(xiàn)了大家的解釋,應(yīng)該也是比較權(quán)威的解釋吧:每個(gè)進(jìn)程都有自己的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出,對于某些依賴于OS的進(jìn)程,可能其輸出緩沖區(qū)很小,如果不能及時(shí)的讀出(標(biāo)準(zhǔn)輸出、標(biāo)注錯(cuò)誤輸出),將導(dǎo)致進(jìn)程不能正常退出。我的程序中標(biāo)準(zhǔn)輸出已經(jīng)讀了,顯然原因不是這個(gè),難道是錯(cuò)誤輸出緩沖區(qū)中的數(shù)據(jù)沒有讀出導(dǎo)致的?帶著這個(gè)疑問,對程序作了一些更改:

  1. ProcessBuilder pb = new ProcessBuilder("wmic",...);  
  2. pb.redirectErrorStream(true);  
  3. Process p = pb.start();  
  4. BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  
  5. String tmp = null;  
  6.  
  7. while ((tmp = br.readline()) != null) {  
  8.     System.out.println(tmp);  
  9. }  
  10. int exitValue = p.waitfor(); 

編譯運(yùn)行,發(fā)現(xiàn)還是有問題,依然還是阻塞。又google了一下,大家的評論大多還是關(guān)于標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出,那這程序應(yīng)該是沒有問題了。后來在cmd中敲入wmic的命令,發(fā)現(xiàn)wmic命令敲入以后會進(jìn)入一個(gè)自有的提示符中,難道是因?yàn)闃?biāo)準(zhǔn)輸入的問題。后來又google了一下,驗(yàn)證了我的猜想,果然是因?yàn)閣mic進(jìn)程會等待標(biāo)準(zhǔn)輸入,而程序中沒有處理標(biāo)準(zhǔn)輸入的地方,是標(biāo)準(zhǔn)輸入阻塞了進(jìn)程的退出,修改代碼:

  1. ProcessBuilder pb = new ProcessBuilder("wmic",...);  
  2. pb.redirectErrorStream(true);  
  3. Process p = pb.start();  
  4. p.getOutputStream().close();  
  5. BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  
  6. String tmp = null;  
  7.  
  8. while ((tmp = br.readline()) != null) {  
  9.     System.out.println(tmp);  
  10. }  
  11. int exitValue = p.waitfor(); 

編譯運(yùn)行,程序成功執(zhí)行。果然是標(biāo)準(zhǔn)輸入的原因。

后來執(zhí)行的過程中換了一個(gè)服務(wù)的名稱,發(fā)現(xiàn)執(zhí)行失敗(能夠正常退出,但是返回的結(jié)果是“無效動作”),但是同樣的命令,在命令行中執(zhí)行成功,而且直接適用Runtime.exec()方法中寫入整個(gè)命令也能夠執(zhí)行成功,難道是ProcessBuilder的錯(cuò)誤,ProcessBuilder構(gòu)造函數(shù)有兩個(gè):

ProcessBuilder(List<String> command)

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

ProcessBuilder(String... command)

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

找到ProcessBuilder的源代碼,發(fā)現(xiàn)了對List<String>的解析方法:JDK將List中的所有字符串用空格連接,對list中的每個(gè)字符串JDK先判斷串中是否包含空格,如果包含空格,用雙引號將該字符串引起來,再拼到前面字符串的后面(應(yīng)該是為了解決路徑中包含空格的問題),可恰好Wmic命令的參數(shù)中有一段是name="ServiceName",如果ServiceName中包換空格,JDK就會把name="service name"的外層加一個(gè)雙引號,導(dǎo)致wmic不能解析該命令了。

問題終于全都解決了,耗費(fèi)了多半天的時(shí)間,不過收獲總是有的,這里總結(jié)一下,在使用Java調(diào)用外部命令的時(shí)候,一定要注意對標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)輸入和錯(cuò)誤輸出的處理。對于一般的命令,只需要將標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出合并,一起讀出來或者在另外的線程中讀出來,而對于一些特殊的命令,還有處理標(biāo)準(zhǔn)輸入。建議即使不使用標(biāo)準(zhǔn)輸入,先close了,總是不會出錯(cuò)了。另外,使用ProcessBuilder時(shí)要注意它的空格處理方式是否是你想要的,如果不是,就不能用ProcessBuilder了,直接使用Runtime.exec()就好了。

原文鏈接:http://blog.csdn.net/ragic/article/details/5583164

責(zé)任編輯:林師授 來源: ragic的博客
相關(guān)推薦

2023-03-15 08:39:07

遠(yuǎn)程服務(wù)調(diào)用

2009-09-04 09:36:17

Java調(diào)用

2012-03-01 13:34:02

Java

2012-02-07 13:21:37

Java

2021-06-04 18:14:15

阻塞非阻塞tcp

2009-06-19 16:55:47

JNI調(diào)用C語言

2010-10-29 16:12:51

Oracle存儲過程

2010-03-05 10:36:52

Python調(diào)用zip

2012-05-07 08:55:45

Redisbgsavebgrewriteao

2012-06-14 10:34:40

Java阻塞搜索實(shí)例

2023-07-31 08:55:01

Java NIO非阻塞阻塞

2011-08-29 09:54:45

LUAJAVA 方法

2021-07-26 17:28:03

Java開發(fā)代碼

2009-07-09 14:32:39

2010-10-09 16:26:59

mysql存儲過程

2023-10-17 09:26:44

Java工具

2009-12-08 17:15:43

PHP調(diào)用Java語言

2009-06-17 13:19:50

Java調(diào)用DLL

2009-08-03 12:57:27

C#調(diào)用DLL

2010-03-15 18:34:08

Java多線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日本网站在线看 | 视频一区二区在线观看 | 精品一区二区三区在线播放 | 五月激情婷婷在线 | 91精品国产一区二区三区 | 国产一区二区精品在线 | 国产乱一区二区三区视频 | 国产高清免费 | 毛色毛片免费看 | 午夜精品久久久久久久星辰影院 | 91精品国产综合久久小仙女图片 | 成人在线免费网站 | 国产精品999 | 午夜激情视频 | 国产成人99久久亚洲综合精品 | 亚洲精品高清视频在线观看 | 日韩欧美国产精品 | 中文字幕精品视频在线观看 | 人操人免费视频 | 五月综合激情婷婷 | 天堂色区 | av色站| 欧美一级在线观看 | 国产成人福利在线观看 | 欧美性video| 91免费版在线观看 | 日韩精品av一区二区三区 | 亚洲二区视频 | 成人一区精品 | 99re热这里只有精品视频 | 伊人春色在线观看 | 免费av毛片 | 91亚洲国产成人久久精品网站 | 亚洲精品粉嫩美女一区 | 成人国产精品色哟哟 | 亚洲精品国产成人 | 久青草影院 | 国产精品无码久久久久 | 亚洲精精品 | 亚洲国产成人精品女人久久久 | 蜜桃综合在线 |