知识大全 驯服Tiger之访问环境变量和调用子进程
Posted 知
篇首语:内心简单,知足常乐,便是余生最美好的养生。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 驯服Tiger之访问环境变量和调用子进程相关的知识,希望对你有一定的参考价值。
驯服Tiger之访问环境变量和调用子进程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
访问平台专有的信息并不是一件容易的事 虽然可以使用 Runtime exec() 创建进程 但由于平台之间的差异 构造参数集常常令人头痛不已 此外 System 的 getenv() 方法从开始进行 Java 编程就遭到反对 什么时候一个遭到反对的方法不再被反对呢?使用 System 的 getenv() 方法时就会遇到这种情况 Tiger 以 年正式发布之前的 Java 平台为基础 它没有抛弃该方法 同时还提供了一个新的类 ProcessBuilder (属于包 java lang ) 用它来创建进程并与系统进程交互 访问环境变量 虽然我个人并不想退回到原来使用 AWT 组件的事件模型 但是早期的 Java 平台版本(称为 alpha 版)有一个很好的特性 即能够访问环境变量 该方法和当时 编写一次 随处运行 的颂词背道而驰 因此当 Java 平台发布 版时 System 的 getenv() 方法受到了抨击 虽然 版为何抛弃原来的一些内容一直令我迷惑不解 但我常常看到该方法引起新入门开发人员的兴趣 时间回到 年 您现在终于能够使用这个方法了 如清单 所示 该方法的使用很简单 清单 调用 getenv public class EnvTest public static void main(String args[]) System out println(System getenv(args[ ])); 只要在命令行中随 getenv 调用传入变量的名称 就可以得到它的当前值 比如在我那台用了两年的桌面机上 如果输入参数 PROCESSOR_IDENTIFIER 就会得到清单 所示的结果 清单 getenv 的输出结果 java EnvTest PROCESSOR_IDENTIFIER x Family Model Stepping GenuineIntel 首先要注意的是方法名 getenv() 它完全采用小写形式 而不是采用您所预料的大小写混合形式( getEnv() ) 这是因为在正式发布之前的最初命名方法就是这样的 其次 访问环境变量常常要使用平台专用的代码 如果确实希望这样做也可以 但这样就偏离了百分之百的纯 Java 模型 上述代码本身仍然是纯粹的 Java 代码 因此使用该方法并不完全违背这一原则 但是使用了这么多年的系统属性之后 使用 getenv() 感觉怪怪的 Tiger 提供了两个版本的 getenv() 方法 而不是一个 第二个版本返回与系统中当前设置的所有环境变量对应的 名/值 对(name value pairs) 清单 说明了这种新方法的应用 并打印出了所有环境变量的键和值 清单 访问所有的环境变量 import java util Map; public class EnvDump public static void main(String args[]) for (Map Entry entry: System getenv() entrySet()) System out println(entry getKey() + / + entry getValue()); 理解 ProcessBuilder 这为我们带来了一个新的类 java lang ProcessBuilder 平台的早期版本允许通过 Runtime 类的 exec() 方法创建本机进程 该方法仍然有效 但是因为能以 String 数组作为参数 以 File 参数作为工作目录 所以用这种方法定制子进程比较困难 使用 ProcessBuilder 可以简化这个过程 它提供了 directory(File) 方法来改变进程的工作目录 可以用 environment() 方法在进程空间中添加和删除环境变量 清单 说明了 ProcessBuilder 的一种简单用法 它使用 ipconfig 命令获得 Internet 配置信息 该方法适用于多数平台 否则可以将 ipconfig 改写成所用平台上的工作命令 启动进程构造程序之后 需要获得其 InputStream 以读入所创建进程的结果 清单 使用 ProcessBuilder import java io *; public class ProcessTest public static void main(String args[]) throws IOException Process p = new ProcessBuilder( ipconfig ) start(); InputStream is = p getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br readLine()) != null) System out println(line); 如清单 所示 该程序的运行结果与在命令行中执行 ipconfig 所得到的结果类似(您得到的结果看起来可能有所不同) 清单 ProcessBuilder 的输出结果 Windows IP Configuration Ethernet adapter Local Area Connection: Connection specific DNS Suffix : IP Address : Subnet Mask : Default Gateway : 如前所述 ProcessBuilder 类不仅能生成新的进程 而且还能获得其结果 在调用其 start() 方法之前 还可以调整进程所执行的上下文 如果不喜欢环境变量 您可以使用 environment 获得当前设置 并调用 clear() 清除映射 如果需要添加环境变量 可以调用 environment 获得当前设置 然后通过 put(name value) 添加新的变量 如果希望使用新的工作目录 可以调用 directory() 并提供新的工作目录作为 File 对象 就是这么简单 使用表示将运行的命令及其参数的数目可变的字符串参数来创建 ProcessBuilder 一旦使用新的环境变量和工作目录配置 ProcessBuilder 就可以调用 start() 来执行命令 结束语 您希望您所喜欢的方法在遭到反对之后再受到欢迎吗?当然 有时候 一个受到抨击的方法虽然从没在 Java 发行版本中受到真正的支持 但它可能重新获得新生 只要有足够多的用户在 Sun 的 Bug Parade 上呼吁和投票 开发人员就可以改变 Java 平台的演进方向 虽然我曾怀疑过时的 AWT 事件模型会卷土重来——尽管每个人都这样要求 但只是一些简单的问题(如访问环境变量)最终得到了 Java 平台的支持 小心地使用它 除了反对 getenv 的问题之外 ProcessBuilder 还提供了一种创建本机进程的简单方法 应该用它来代替所有过时的 Runtime exec() 调用 开始重构吧! cha138/Article/program/Java/hx/201311/26897相关参考
Java反射访问私有变量和私有方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 引言 对于软
Javascript和C#之间的互相调用和访问 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这
知识大全 JavaScript获取后台C#变量以及调用后台方法
JavaScript获取后台C#变量以及调用后台方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 js 定时器setTimeout无法调用局部变量的解决办法
js定时器setTimeout无法调用局部变量的解决办法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 asp.net后台cs中的JSON格式变量在前台Js中调用方法
asp.net后台cs中的JSON格式变量在前台Js中调用方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
Java中对线程间的变量访问也需要同步控制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一个简
每一种语言都有变量的概念变量是用来存储信息的一个元素比如下面这个函数 functionStudent(nameagefrom) thisname=name;&n
一个C#写的调用外部进程类 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
iframe子页面调用父页面js函数 子页面调用父页面函数只需要写上windowpraent就可以了比如调用a()函数就写成 windowparenta(); 子页面取父页面中的标签中的值比
经常看到论坛中有人问到当用Process组件启动新的进程后如何获取它的输出的问题采取将子进程的输出定向到一个临时文件中当然也可以解决问题但是这样每次父进程从临时文件中获取信息后还要删除该临时文件毕