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

简介: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.

 

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();

       }

}

 

 

 

 

目录
相关文章
|
开发框架 算法 安全
RFID 卡片型号及卡号获取 | 学习笔记
快速学习 RFID 卡片型号及卡号获取
RFID 卡片型号及卡号获取 | 学习笔记
|
传感器 监控 API
基于STM32的智能灌溉系统设计与实现
基于STM32的智能灌溉系统设计与实现
1555 1
|
6月前
|
存储 JSON 算法
京东商品 SKU 信息接口技术干货:数据拉取、规格解析与字段治理(附踩坑总结 + 可运行代码
本文详解京东SKU接口对接核心技术:涵盖高精度参数校验(如SKU ID纯数字、时间戳格式)、权限申请要点(认证材料、用途合规说明)、MD5签名生成(空值过滤、ASCII排序)、规格编码解析与区域库存处理,并总结7类高频坑及解决方案,附可直接运行的Python客户端代码。
|
7月前
|
数据可视化 IDE 数据管理
RStudio 2025 + R 4.5.0 安装与配置教程 Windows版:解压+双软件安装+自定义路径+R语言关联指南
RStudio是R语言的集成开发环境(IDE),集代码编辑、数据管理、可视化与协作功能于一体,大幅提升数据分析效率。本文详解2025版RStudio与R-4.5.0的离线安装、路径配置及环境关联步骤,助你快速上手。
2177 0
|
编译器 API Android开发
Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用
本文介绍Kotlin Multiplatform (KMP) 中使用 `expect` 和 `actual` 关键字处理多平台API调用的方法。通过共通代码集定义预期API,各平台提供具体实现,编译器确保正确匹配,支持依赖注入、枚举类处理等,实现跨平台代码重用与原生性能。附带示例展示如何定义跨平台函数与类。
933 0
基于多路径路由的全局感知网络流量分配优化算法matlab仿真
本文提出一种全局感知网络流量分配优化算法,针对现代网络中多路径路由的需求,旨在均衡分配流量、减轻拥塞并提升吞吐量。算法基于网络模型G(N, M),包含N节点与M连接,并考虑K种不同优先级的流量。通过迭代调整每种流量在各路径上的分配比例,依据带宽利用率um=Σ(xm,k * dk) / cm来优化网络性能,确保高优先级流量的有效传输同时最大化利用网络资源。算法设定收敛条件以避免陷入局部最优解。
|
存储 编解码 算法
基于FPGA的直接数字频率合成器verilog实现,包含testbench
本项目基于Vivado 2019.2实现DDS算法,提供完整无水印运行效果预览。DDS(直接数字频率合成器)通过数字信号处理技术生成特定频率和相位的正弦波,核心组件包括相位累加器、正弦查找表和DAC。相位累加器在每个时钟周期累加频率控制字,正弦查找表根据相位值输出幅度,DAC将数字信号转换为模拟电压。项目代码包含详细中文注释及操作视频。
|
SQL 数据库 数据库管理
SQL Server数据库有三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式
SQL Server数据库有三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式 SQL Server数据库有三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式:   1.
1926 0
|
网络虚拟化
VLAN实现二层流量隔离(mux-vlan)应用基础配置
VLAN实现二层流量隔离(mux-vlan)应用基础配置
616 1

热门文章

最新文章