JDK5.0特性,使用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对象
* ProcessBuilder的environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量
* ProcessBuilder的directory方法切换工作目录
* Process的getInputStream方法获得进程的标准输出流,getErrorStream方法获得进程的错误输出流
*/
public class UsingProcessBuilder {
/**获取Windows系统下的网卡的MAC地址*/
public static 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 = new byte[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下,并且需要两个环境变量的支持*/
public static boolean 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){
}
return true;
}
public static void 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(newOutputStreamWriter(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();
}
}
public static void main(String[] args){
List<String> address = UsingProcessBuilder.getPhysicalAddress();
for(String add : address){
System.out.printf("物理网卡地址: %s%n",add);
}
executeMyCommand1();
executeMyCommand2();
}
}
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291460.html
JDK5.0特性,使用ProcessBuilder执行本地命令的更多相关文章
- 7.使用ProcessBuilder执行本地命令(转)
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...
- ProcessBuilder执行本地命令
/**关键技术剖析 * 用本命令名和命令的参数选项构造ProcessBuilder对象,它的start方法执行命令,启动一个进程,返回一个Process对象 * ProcessBuilder的envi ...
- JDK5.0 特性-线程任务执行架构 ScheduledExecutorService
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html import java.util.concurrent.Callable ...
- JAVA中ProcessBuilder执行cmd命令找不到路径的解决方法
今天遇到了一个很奇葩的问题,终于解决了,记一下,以做备忘. 前提条件:工程路径在D盘下 cmd要执行的可执行文件路径不在D盘下 然后...出事了............................ ...
- JDK5.0 特性-线程锁Lock
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html import java.util.concurrent.Executor ...
- JDK5.0特性-线程 Callable和Future
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291466.html import java.util.concurrent.Callable ...
- JDK5.0 特性 监控与管理虚拟机
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291465.html import java.lang.management.ClassLoa ...
- JDK5.0 特性线程 同步装置之CountDownLatch 同步装置之CyclicBarrier 线程 BlockingQueue
来自:http://www.cnblogs.com/taven/category/475298.html import java.util.concurrent.CountDownLatch; imp ...
- JDK5.0 特性-线程同步装置之Semaphore
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...
随机推荐
- 使用Layui和Vue实现分页
原理就是利用Layui的分页组件和Vue组件的模板渲染功能. 我下面直接贴代码,比较直观. index.html <!DOCTYPE html> <html> <head ...
- sqlite - Sqlite Wrappers - Delphi
http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers Aducom's SQLite: Open source (NewBSD) Delphi (4. ...
- LoadRunner的简单使用《第一篇》
LoadRunner是一个用压力测试的软件.这东西比较难上手,光安装就非常麻烦.好不容易一步步跟着安装说明安装好之后,还是用不了. 记录一个问题如下: 导入脚本的时候报错fail to create ...
- OpenCV 机器学习之 支持向量机的使用方法实例
用支持向量机进行文理科生的分类,根据的特征主要是 数学成绩与语文成绩,这两个特征都服从高斯分布 程序代码例如以下: 分类结果:
- 算法学习 - 平衡二叉查找树实现(AVL树)
平衡二叉查找树 平衡二叉查找树是非常早出现的平衡树,由于全部子树的高度差不超过1,所以操作平均为O(logN). 平衡二叉查找树和BS树非常像,插入和删除操作也基本一样.可是每一个节点多了一个高度的信 ...
- easyui中使用的遮罩层
easyui 的 dialog 是继承自 window的,而 window中有modal这样的属性(见参考资料),就是用于打开模态的窗口的,也就是你说的有遮罩层的窗口.所以不需要额外的代码,仅需在di ...
- android之截屏(包括截取scrollview与listview的)
public class ScreenShot { // 获取指定Activity的截屏,保存到png文件 public static Bitmap takeScreenShot(Activity a ...
- MATLAB SVM
clc;clear;close all; traindata = [1,0; 3,10; 2,2; 2,3; -1,-1; -6,-4; -4,-1; -1.5, -3];group = [1 1 1 ...
- python中的归并排序
本来在博客上看到用python写的归并排序的程序,然后自己跟着他写了一下,结果发现是错的,不得不自己操作.而自己对python不是非常了解所以就变百度边写,最终在花了半个小时之后就写好了. def m ...
- Android开发之Navigationdrawer导航抽屉功能的实现(源码分享)
导航抽屉(navigationdrawer)是一个从屏幕左边滑入的面板,用于显示应用的主要导航项目.用户能够通过在屏幕左边缘滑入或者触摸操作栏的应用图标打开导航抽屉. 导航抽屉覆盖在内容之上,但不覆盖 ...