1. 程式人生 > >7.使用ProcessBuilder執行本地命令

7.使用ProcessBuilder執行本地命令

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

/**

*J2SE5.0之前使用Runtime的exec方法執行本地命令.

*J2Se5.0之後,可以使用ProcessBuilder執行本地命令

*它提供的功能更加豐富,能夠設定設定工作目錄、環境變數等

*本例PorcessBuilder執行Windows作業系統的"ipconfig/all"命令,獲取本機網絡卡的MAC地址

*/

/**關鍵技術剖析

*用本命令名和命令的引數選項構造ProcessBuilder物件,它的start方法執行命令,啟動一個程序,返回一個Process物件

*ProcessBuilderenvironment方法獲得執行程序的環境變數

,得到一個Map,可以修改環境變數

*ProcessBuilderdirectory方法切換工作目錄

*ProcessgetInputStream方法獲得程序的標準輸出流,getErrorStream方法獲得程序的錯誤輸出流

*/

publicclass UsingProcessBuilder {

/**獲取Windows系統下的網絡卡的MAC地址*/

publicstatic List<String> getPhysicalAddress(){

Process p = null;

List<String> address = new ArrayList<String>();

//物理網絡卡列表

try{

p = new ProcessBuilder("ipconfig","/all").start(); //執行ipconfig/all命令

}catch(IOException e){

return address;

}

byte[] b = newbyte[1024];

int readbytes = -1;

StringBuffer sb = new StringBuffer();

//讀取程序輸出值

//JAVA IO,輸入輸出是針對JVM而言,讀寫是針對外部資料來源而言

InputStream in = p.getInputStream();

try{

while((readbytes = in.read(b)) != -1){

sb.append(new String(b,0,readbytes));

}

}catch(IOException e1){

}finally {

try{

in.close();

}catch (IOException e2){

}

}

//以下是分析輸出值,得到物理網絡卡

String rtValue = sb.toString();

int i = rtValue.indexOf("Physical Address. . . . . . . . . :");

while (i > 0){

rtValue = rtValue.substring(i + "Physical Address. . . . . . . . . :".length());

address.add(rtValue.substring(1,18));

i = rtValue.indexOf("Physical Address. . . . . . . . . :");

}

return address;

}

/**執行自定義的一個命令,該命令放在C:/temp,並且需要兩個環境變數的支援*/

publicstaticboolean executeMyCommand1(){

//建立系統程序建立器

ProcessBuilder pb = new ProcessBuilder("myCommand","myArg1","myArg2");

Map<String, String> env = pb.environment(); //獲得程序的環境

//設定和去除環境變數

env.put("VAR1", "myValue");

env.remove("VAR0");

env.put("VAR2", env.get("VAR1") + ";");

//迭代環境變數,獲取屬性名和屬性值

Iterator it=env.keySet().iterator();

String sysatt = null;

while(it.hasNext())

{

sysatt = (String)it.next();

System.out.println("System Attribute:"+sysatt+"="+env.get(sysatt));

}

pb.directory(new File("C:/temp"));

try{

Process p = pb.start(); //得到程序例項

//等待程序執行完畢

if(p.waitFor() != 0){

//如果程序執行結果不為0,表示程序是錯誤退出的

//獲得程序例項的錯誤輸出

InputStream error = p.getErrorStream();

//do something

}

InputStream sdin = p.getInputStream(); //獲得程序例項的標準輸出

//do something

}catch(IOException e){

}catch(InterruptedException e){

}

returntrue;

}

publicstaticvoid executeMyCommand2(){

ProcessBuilder pb = null;

String sysatt = null;

try

{

//建立一個程序示例

pb = new ProcessBuilder("cmd.exe");

//獲取系統引數並列印顯示

Map<String, String> env = pb.environment();

Iterator it=env.keySet().iterator();

while(it.hasNext())

{

sysatt = (String)it.next();

System.out.println("System Attribute:"+sysatt+"="+env.get(sysatt));

}

//設定工作目錄

pb.directory(new File("d://myDir"));

Process p = pb.start();

//將要執行的Windows命令寫入

BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

//'/r/n'是必須寫入的

bw.write("test.bat /r/n");

bw.write("ping -t www.yahoo.com.cn /r/n");

//flush()方法是必須呼叫的

bw.flush();

//將執行結果列印顯示

InputStream is = p.getInputStream();

            InputStreamReader isr = new InputStreamReader(is, "GBK");

BufferedReader br = new BufferedReader(isr);

String line;

while ((line = br.readLine()) != null)

{

System.out.println(line);

}

}

catch (Exception e)

{

e.printStackTrace();

}

}

publicstaticvoid main(String[] args){

List<String> address = UsingProcessBuilder.getPhysicalAddress();

for(String add : address){

System.out.printf("物理網絡卡地址: %s%n",add);

}

executeMyCommand1();

executeMyCommand2();

}

}

相關推薦

7.使用ProcessBuilder執行本地命令

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.io.InputStream;

JDK5.0新特性系列---7.使用ProcessBuilder執行本地命令

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.io.InputStream

java之ProcessBuilder執行系統命令

轉自:http://blog.csdn.net/yasha009/article/details/52051629 可以使用java中的ProcessBuilder執行本地命令或指令碼等工作: 以下是一個簡單的使用java呼叫本地python指令碼的例子。從某工程程式

老男孩教育每日一題-2017年5月7日-加餐-linux下面如何實現,執行rm命令,就顯示do not use rm command

linux別名 每日一題 1.題目-老男孩教育每日一題-2017年5月7日-加餐-linux下面如何實現,執行rm命令,就顯示do not use rm command2.要求結果[[email protected]/* */ ~]# rm do not use rm command3.答

框架綜合實踐(7)--批量處理命令命令執行指令碼)

目的 自動化指令碼開發階段,我們會使用工具pycharm IDE來編輯執行指令碼,但是指令碼開發完成後,每次執行指令碼都要開啟工具就會變得很麻煩,而且pycharm IDE比較消耗資源,影響執行效率,這種情況下,我們可以使用cmd命令或者將cmd命令封裝為bat批處理指令碼來執行。 裝置連線

vue-cli 專案執行時報錯處理,'webpack-dev-server' 不是內部或外部命令,也不是可執行的程式,更換電腦執行本地的vue-cli專案報錯處理

在做vue-cli 腳手架搭建專案時,把本地專案拷回自己的電腦上執行報錯,後來經查閱解決, 報錯資訊 'webpack-dev-server' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 npm ERR! code ELIFECYCLE npm ERR! er

0 Linux下Java使用ProcessBuilder執行命令與直接Bash執行命令之間的不同(環境變數方面)

0 問題發生 xiaojietest.java package tasks; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter;

Python免祕鑰ssh遠端登入執行命令and本地執行shell命令

python遠端執行 python paramiko 模組的應用 環境 # yum install python-dev # yum install python-devel # pi

java 執行linux 本地命令

public static String executeCMD(final String[] cmdStrArr) { StringBuffer resBuf = new StringBuffer(); Runtime rt = Ru

java執行cmd命令

spa dbca script dmgr share pub pdm meeting 碎片 從網上找的java執行cmd命令的文章,摘抄一段。 java的Runtime.getRuntime().exec(commandStr)可以調用執行cmd指令。cmd /c dir

Centos 執行shell命令返回127錯誤

建數據庫 mysq data 存在 思路 功能 自動創建 運行 用戶 shell腳本功能:連接mysql,自動創建數據庫,腳本如下 mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASSWORD --default-character-s

php 執行shell命令 打印錯誤信息

信息 資源 null function $cmd = "rm 1.txt";//刪除一個不存在的文件,查看報錯信息 $res = doShell($cmd); var_dump($res); //該函數沒有限制條件,可以直接放在代碼中使用 function doShell($cmd,$cwd=

c# 設置和取消文件夾共享及執行Dos命令

urn cati 如果 llc seo value close 輸出 dos命令 /// <summary> /// 設置文件夾共享 /// </summary> /// <pa

PHP執行系統命令的有幾個常用的函數

exe 自動 文件操作 nal 外部命令 中間 ring 打開 lcm PHP執行系統命令的有幾個常用的函數,如有:system函數、exec函數、popen函數,passthru,shell_exec函數他們都可以執行系統命令,不過前提時必須系統給了權限了哦。 syste

Mysql缺少可執行命令

nbsp not sql命令 found linux1 not found 題解 inux 找不到 MySQL問題解決:-bash:mysql:command not found 問題: [[email protected]/* */ /]# mys

shell--7、Shell test 命令

shell test 命令Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試。數值測試參數說明-eq等於則為真-ne不等於則為真-gt大於則為真-ge大於等於則為真-lt小於則為真-le小於等於則為真實例演示:num1=100 num2=100 if test $

java代碼中執行liunx命令

number sta stream mod ces linu pla comm shell public static String runShell(String command){ try{ String[] commands = isLinux

Esper調用Java代碼執行系統命令

java esper 系統 Esper語言是可以調用高級語言的靜態方法的:以調用Java的靜態方法執行系統命令為例:select Runtime.getRuntime().exec(\"calc\"),avg(price) from " + product + ".win:length_batch

python之執行shell命令

python[[email protected]/* */ ~]# python Python 2.7.5 (default, Sep 15 2016, 22:37:39) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2 Type "help",

Java 7執行的 Nashorn,取代 Rhino

eof 不能 name mir 正式版 data- fin down 怎麽辦 驚現有人把 OpenJDK 上的 Nashorn dump 下來,使得 Java 7 都能夠使用。源代碼在 https://bitbucket.org/ramonza/nashorn-back