亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java使用Runtime.getRuntime().exec調(diào)用外部程序

 更新時間:2025年06月10日 09:05:13   作者:墨鴉_Cormorant  
Runtime.getRuntime().exec一般用于調(diào)用外部可執(zhí)行程序或系統(tǒng)命令,并重定向外部程序的標準輸入,準輸出和標準錯誤到緩沖池,下面我們來看看Java如何使用它進行調(diào)用外部程序吧

概述

Runtime.getRuntime().exec 用于調(diào)用外部可執(zhí)行程序或系統(tǒng)命令,并重定向外部程序的標準輸入、標準輸出和標準錯誤到緩沖池。功能和windows“運行”類似。

格式:

Process process = Runtime.getRuntime().exec( ".//p.exe ");
process.waitfor();

第一行的“.//p.exe”是要執(zhí)行的程序名,Runtime.getRuntime() 返回當前應用程序的Runtime對象,該對象的 exec() 方法指示Java虛擬機創(chuàng)建一個子進程執(zhí)行指定的可執(zhí)行程序,并返回與該子進程對應的Process對象實例。通過Process可以控制該子進程的執(zhí)行或獲取該子進程的信息。

第二條語句的目的等待子進程完成再往下執(zhí)行。

方法API

Runtime.getRuntime().exec共有六個重載方法:

// 在單獨的進程中執(zhí)行指定的外部可執(zhí)行程序的啟動路徑或字符串命令
public Process exec(String command)
// 在單獨的進程中執(zhí)行指定命令和變量
public Process exec(String[] cmdArray)
// 在指定環(huán)境的獨立進程中執(zhí)行指定命令和變量
public Process exec(String command, String[] envp)
// 在指定環(huán)境的獨立進程中執(zhí)行指定的命令和變量
public Process exec(String[] cmdArray, String[] envp)
// 在指定環(huán)境和工作目錄的獨立進程中執(zhí)行指定的字符串命令
public Process exec(String command, String[] envp, File dir)
// 在指定環(huán)境和工作目錄的獨立進程中執(zhí)行指定的命令和變量
public Process exec(String[] cmdarray, String[] envp, File dir)
// 參數(shù)說明:
    cmdarray // 包含所調(diào)用命令及其參數(shù)的數(shù)組。數(shù)組第一個元素是命令,其余是參數(shù)
    envp     // 字符串數(shù)組,其中每個元素的環(huán)境變量的設置格式為 name=value,如果子進程應該繼承當前進程的環(huán)境,則該參數(shù)為null
    dir         // 子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數(shù)為null
    
// 參數(shù)cmdArray 示例:shutdown -s -t 3600
String arr[] = {"shutdown","-s","-t","3600"};
Process process = Runtime.getRuntime().exec(arr[]);
/*
注意:
    在調(diào)用這個方法時,不能將命令和參數(shù)放在一起,eg:String arr[] = {"shutdown -s -t 3600"};
    這樣會導致程序把“shutdown -s -t 3600”當成是一條命令的名稱,然后去查找“shutdown -s -t 3600”這條命令,它當然會找不到,所以就會報錯
*/

注意:

Runtime.exec() 不是cmd或shell環(huán)境,因此無法直接調(diào)用dir等命令,需要在程序中讀取運行的操作系統(tǒng)平臺,以調(diào)用不同的命令解釋器(NT:cmd.exe,windows 95/98:command.exe,linux:/bin/sh)

Procss類將持有該程序返回 Java VM 的引用。這個procss類是一個抽象類,具體子類的實現(xiàn)依賴于不同的底層操作系統(tǒng)。

Process 的常用方法:

// 導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經(jīng)終止。
int waitFor()
/*	如果已終止該子進程,此方法立即返回。
	如果沒有終止該子進程,調(diào)用的線程將被阻塞,直到退出子進程,0 表示正常終止 */

// 殺掉子進程
void destroy()

// 返回子進程的出口值,值 0 表示正常終止
int exitValue()

// 獲取子進程的錯誤流
InputStream getErrorStream()
// 獲取子進程的輸入流
InputStream getInputStream()
// 獲取子進程的輸出流
OutputStream getOutputStream()

程序阻塞問題

通過 Process實例.getInputStream() 和 Process實例.getErrorStream() 獲取的輸入流和錯誤信息流是緩沖池向當前Java程序提供的,而不是直接獲取外部程序的標準輸出流和標準錯誤流。

而緩沖池的容量是一定的,因此若外部程序在運行過程中不斷向緩沖池輸出內(nèi)容,當緩沖池填滿,那么外部程序?qū)和_\行直到緩沖池有空位可接收外部程序的輸出內(nèi)容為止。(采用xcopy命令復制大量文件時將會出現(xiàn)該問題)

解決辦法:當前的Java程序不斷讀取緩沖池的內(nèi)容,從而為騰出緩沖池的空間。

Runtime r = Runtime.getRuntime();
try{
    Process proc = r.exec("cmd /c dir"); // 假設該操作為造成大量內(nèi)容輸出
      // 采用字符流讀取緩沖池內(nèi)容,騰出空間
      BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gbk")));
      String line = null;
      while ((line = reader.readLine()) != null){
         System.out.println(line);
      }
     
      /* 或采用字節(jié)流讀取緩沖池內(nèi)容,騰出空間
       ByteArrayOutputStream pool = new ByteArrayOutputStream();
       byte[] buffer = new byte[1024];
       int count = -1;
       while ((count = proc.getInputStream().read(buffer)) != -1){
         pool.write(buffer, 0, count);
         buffer = new byte[1024];
       }
       System.out.println(pool.toString("gbk"));
       */
     
      int exitVal = proc.waitFor();
      System.out.println(exitVal == 0 ? "成功" : "失敗");
}
catch(Exception e){
      e.printStackTrace();
}

注意:外部程序在執(zhí)行結(jié)束后需自動關(guān)閉,否則不管是字符流還是字節(jié)流均由于既讀不到數(shù)據(jù),又讀不到流結(jié)束符,從而出現(xiàn)阻塞Java進程運行的情況。cmd的參數(shù) “/c” 表示當命令執(zhí)行完成后關(guān)閉自身。

實例

在當前目錄執(zhí)行dir命令,并將結(jié)果保存到 c:\dir.txt 文本文件中:

前提:假設當前用戶的家目錄為c:\user\fsjohnhuang

c:\user\fsjohnhuang下的目錄結(jié)構(gòu)

c:\user\fsjohnhuang 
|--jottings 
|--test.txt

d:\test下的目錄結(jié)構(gòu)

d:\test
|--movies
|--readme.txt

代碼片段

Runtime r = Runtime.getRuntime();
try{
  Process proc = r.exec("cmd /c dir > %dest%", new String[]{"dest=c:\\dir.txt", new File("d:\\test")});
  int exitVal = proc.waitFor(); // 阻塞當前線程,并等待外部程序中止后獲取結(jié)果碼
  System.out.println(exitVal == 0 ? "成功" : "失敗");
}
catch(Exception e){
  e.printStackTrace();
}

執(zhí)行代碼后查看c:\dir.txt文件內(nèi)容如如下:

驅(qū)動器 D 中的卷沒有標簽。
卷的序列號是 8074-B214
 
 D:\test 的目錄
 
2014/09/22  14:45    <DIR>          movies
2014/03/31  17:14             8,642 readme.txt

拓展

1,調(diào)用一次exec方法執(zhí)行多條cmd命令,使用 && 分隔命令,該方法的局限性是只能在cmd里面使用

Runtime.getRuntime().exec("cmd /c set CLASSPATH=D:\\ && javac D:\\a.java && java a");

// 方法重載:public Process exec(String[] cmdarray, String[] envp, File dir)
String arr[] = {"CLASSPATH=D://","Path=C:\\Program Files\\Java\\jdk1.8.0_131\\bin"};
Runtime.getRuntime().exec("cmd /c javac a.java && java a", arr, new File("D://"));

2.執(zhí)行Runtime.exec()需要注意的陷阱

作為Java語言的一部分。java.lang包被隱藏的導入到每一個Java程序。這個包的表面陷阱,經(jīng)常影響到大多數(shù)程序員。這個月,我將討論運行時exec()方法時的潛伏陷阱。

1.當運行exec()時不會執(zhí)行命令

java.lang.Runtime類,突出了靜態(tài)方法calledgetRuntime(),,它會檢索當前的Java運行時環(huán)境。這是唯一的方法來獲取Runtime對象的引用。獲取該引用,您通過可以調(diào)用Runtime類的exec()方法運行外部程序。開發(fā)人員經(jīng)常調(diào)用這個方法來啟動瀏覽器顯示一個HTML幫助頁面。

exec()有四個重載:

public Process exec(String command);
public Process exec(String [] cmdArray);
public Process exec(String command, String [] envp);
public Process exec(String [] cmdArray, String [] envp);

對于每個這樣的方法,都會產(chǎn)生一個命令,并可能攜帶一組參數(shù)——被傳遞給一個特定操作系統(tǒng)的函數(shù)調(diào)用。這隨后創(chuàng)建一個特定操作系統(tǒng)的進程(一個運行著的程序),procss類將持有該程序返回Java VM的引用。這個procss類是一個抽象類,具體子類的實現(xiàn)依賴于不同的底層操作系統(tǒng)。

你可以通過三種可能的輸入?yún)?shù)到這些方法:

1、一個字符串,表示程序執(zhí)行和程序的任何參數(shù)。

2、一個字符串數(shù)組,通過參數(shù)來區(qū)分出程序的實現(xiàn)功能。

3、一個環(huán)境變量的數(shù)組

傳遞環(huán)境變量是,使用格式化的方式:名稱=值。如果你使用單個字符串和它的參數(shù)的方式調(diào)用exec()的重載,,注意字符串是通過StringTokenizer類被解析,使用空格作為分隔符。

2.陷入 IllegalThreadStateException

運行exec()的第一個陷阱,是theIllegalThreadStateException。 普遍上,第一次對api的嘗試,都是基于一些最常用的方法。例如,執(zhí)行一個java vm的外部過程,我們使用exec()方法。查看外部過程的返回值,我們使用process類的exitValue()方法??吹降闹低獠窟^程的回報,我們使用exitValue()方法在過程類。在我們的第一個示例中,我們將嘗試執(zhí)行Java編譯器(javac exe)。

清單 4.1 BadExecJavac.java

import java.util.*;
import java.io.*;
  public class BadExecJavac
  {
      public static void main(String args[])

到此這篇關(guān)于java使用Runtime.getRuntime().exec調(diào)用外部程序的文章就介紹到這了,更多相關(guān)java調(diào)用外部程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis中resultMap 標簽的使用教程

    mybatis中resultMap 標簽的使用教程

    resultMap 標簽用來描述如何從數(shù)據(jù)庫結(jié)果集中來加載對象,這篇文章重點給大家介紹mybatis中resultMap 標簽的使用,感興趣的朋友一起看看吧
    2018-07-07
  • Java中如何讀取和寫入zip文件問題

    Java中如何讀取和寫入zip文件問題

    這篇文章主要介紹了Java中如何讀取和寫入zip文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java實現(xiàn)系統(tǒng)限流的示例代碼

    Java實現(xiàn)系統(tǒng)限流的示例代碼

    限流是保障系統(tǒng)高可用的方式之一,也是大廠高頻面試題,它在微服務系統(tǒng)中,緩存、限流、熔斷是保證系統(tǒng)高可用的三板斧,所以本文我們就來聊聊如何實現(xiàn)系統(tǒng)限流吧
    2023-09-09
  • Java 虛擬機(JVM)之基本概念詳解

    Java 虛擬機(JVM)之基本概念詳解

    下面小編就為大家?guī)硪黄狫ava 虛擬機(JVM)之基本概念詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Mybatis中多個對象包含同一個對象的處理操作

    Mybatis中多個對象包含同一個對象的處理操作

    這篇文章主要介紹了Mybatis中多個對象包含同一個對象的處理操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Springboot整合Swagger2后訪問swagger-ui.html 404報錯問題解決方案

    Springboot整合Swagger2后訪問swagger-ui.html 404報錯問題解決方案

    這篇文章主要介紹了Springboot整合Swagger2后訪問swagger-ui.html 404報錯,本文給大家分享兩種解決方案,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 解決String字符串轉(zhuǎn)JSONObject順序不對的問題

    解決String字符串轉(zhuǎn)JSONObject順序不對的問題

    這篇文章主要介紹了解決String字符串轉(zhuǎn)JSONObject順序不對的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot日志文件的實現(xiàn)示例

    SpringBoot日志文件的實現(xiàn)示例

    日志是程序中的重要組成部分,使用日志可以快速的發(fā)現(xiàn)和定位問題,本文主要介紹了SpringBoot日志文件的實現(xiàn)示例,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • SpringBoot2.7?WebSecurityConfigurerAdapter類過期配置

    SpringBoot2.7?WebSecurityConfigurerAdapter類過期配置

    這篇文章主要為大家介紹了SpringBoot2.7中WebSecurityConfigurerAdapter類過期應該如何配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Springboot RabbitMQ 消息隊列使用示例詳解

    Springboot RabbitMQ 消息隊列使用示例詳解

    本文通過示例代碼介紹了Springboot RabbitMQ 消息隊列使用,對大家的學習或工作具有一定的參考借鑒價值,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評論