转贴:http://www.cnblogs.com/lewhwa/archive/2007/01/14/620395.html
几乎所有的Java 集成开发环境都需要调用外部进程进行Java程序的构建,编译,运行和调试,Eclipse,NetBeans,JBuilder和Intellij IDLE概莫例外。在执行过程中,将提示信息以黑色全部打印在控制台里,将异常和错误以红色方式打印。以非常醒目交互体验让程序员远离枯燥和乏味。
现在让我们以Eclipse为例来看看它如何工作的,以揭开它神秘面纱,探究隐藏在后面的秘密。
首先,我们准备一个Java 程序,程序如下所示:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
* @author lewhwa
*/
public class HelloWorld {
public static void main(String[] args) throws IOException {
System.out.println( " Where will you go to? " );
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(isr);
String name = reader.readLine();
if (name.toUpperCase().equals( " HEAVEN " )) {
System.out.println( " Welcome to heaven! " );
}
if (name.toUpperCase().equals( " HELL " )){
System.err.println( " Go away!here is hell " );
}
}
}
当运行程序等待输入时,当输入为“heaven”时。在Eclipse的控制台输出如图1所示:
图1
看来,在Eclipse控制台的标准输出(stdout,System.out)在控制台中的显示为为黑色;标准输入(stdin,System.in)的显示为绿色。那么,标准错误输出是咋样的呢?
再次运行程序,当输入为“Hell”时。在Eclipse的控制台输出如图2所示:
图2
哦,标准错误输出(stderr,System.err)在Eclipse的控制台输出为绿色。
我们知道,在Linux的Shell或者在Windows的Command Prompt窗口执行程序,可以在屏幕上打印stdin,stdout,stderr的消息。在Windows上执行时,将弹出一个Command Prompt窗口。在VC下写过Console程序的应该知道,VC在执行这些程序时,也马上弹出一个这样的窗口。如果程序执行太快,将一闪而过。可是在诸如Eclipse之类的Java IDE里面,并没有弹出这样的窗口。我们禁不住要问,它们应用了什么技巧?
无论VC,还是像Eclipse这样的IDE,执行程序,实际上是在自己的进程里产生了另外一个子进程,这点谁也比谁强不了多少。但是,VC是直接将运行的console程序直接产生一个Command Prompt窗口。其输入和输出均放置到那个窗口里。而Eclipse则将这些输入和输出重定向到了自己的Console里。原来一直在像,Eclipse一定采用了什么动态链接库之类的东东来做这些。
直到有一天使用NetBeans,它完全使用Java,是纯Java的。作为IDE,也是将Console程序的输入和输出均在IDE 自己Console显示。这样,我才明白,一定在Java API里有这样的功能:能将外部程序的输入和输出进行拦截,然后在重定向到其它的地方。
重新梳理了一下思路,原来使用过Runtime.exec()这样的东东,是否所有的一切与之有关呢?但只是打开Notepad查看一下某个文本文件之类的应用,搞定也就pass了,没有深究。
仔细查了查这个类,终于发现了这个秘密。秘密就在Process这个类。Runtime.getRuntime.exec()执行外部程序后,将返回一个Process对象。Process有三个函数与此有关:
getInputStream();
getErrorStream();
getOutputStream();
到此,我们大概已经知道Process是Java IDE完成输出输入流拦截的关键所在。下篇,我们将利用此技术在自己的应用中实现这种技术。
分享到:
相关推荐
当使用Java调用外部程序时,可能会遇到程序无法正常退出的情况,通常这是由于进程的输入/输出流未被正确处理造成的。 - **解决方案1:** 关闭标准输入流 当外部程序等待标准输入时,如果没有关闭标准输入流,会...
在Java编程中,数据输入输出流(DataInputStream和DataOutputStream)是用于处理基本数据类型和字符串的I/O操作的重要工具。这两个类提供了机器无关的读写功能,使得在不同平台之间交换数据变得更加简单。本文将详细...
下面将详细介绍如何在Java程序中调用外部jar文件。 首先,了解Java类加载器的工作原理是必要的。默认情况下,Java的系统类加载器会从类路径(CLASSPATH)中加载类,包括JRE自身的库、应用的主类路径以及任何用户...
6. 关闭输入输出流,结束进程,完成调用。 这个过程涉及到跨语言的交互,理解COM接口、进程通信和文件操作等技术。通过这种方式,开发者可以在Java项目中利用Surfer的强大绘图功能,同时保持项目的整体性,避免了...
在上面的代码中,我们使用 `Runtime` 类的 `getRuntime` 方法获取当前进程,然后使用 `exec` 方法执行一个外部命令,打开 cmd 命令行并启动 Msconfig.exe 程序。 总结 在 Java 中,我们可以使用 `Desktop` 类和 `...
### Java通过进程名称杀进程 在日常开发与运维过程中,我们常常需要对系统中的特定进程进行管理和控制。本文将详细介绍如何使用Java代码实现基于进程名称的进程终止功能,特别是针对Windows操作系统下的`java-test....
Java调用Chrome浏览器内核是开发桌面应用时一个常见的需求,尤其在需要嵌入Web页面或者与Web内容交互的场景下。CEF(Chromium Embedded Framework)是一个开源项目,它允许开发者将Google Chrome的Blink渲染引擎和V8...
在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...
java调用.NET webAPI httpclient-4.2.5.jar httpclient-cache-4.2.5.jar httpcore-4.2.4.jar httpmime-4.2.5.jar fluent-hc-4.2.5.jar commons-codec-1.6.jar
在这个“GMSSL的java调用(JNI库和调用实例).zip”压缩包中,我们主要探讨如何在Java环境中通过JNI(Java Native Interface)来调用GMSSL库,以便利用这些国密算法进行数据加解密和哈希运算。 首先,我们需要了解...
本篇文章将详细解释如何利用Java语言调用DOS命令来获取Windows系统的进程列表。这不仅适用于Java开发者,也对系统管理员有所帮助。 #### 一、基础知识介绍 在深入探讨具体的实现方法之前,我们首先需要了解一些...
Java调用SPSS的实例是将Java编程语言与统计分析软件SPSS(Statistical Product and Service Solutions)结合使用的典型应用。SPSS提供了Java接口,使得开发者可以利用Java代码执行SPSS的数据处理和分析任务,无需...
Java调用SOAP(Simple Object Access Protocol)接口是Web服务交互中的常见操作,SOAP是一种基于XML的协议,用于在Web上交换结构化的和类型化的信息。本案例主要关注如何使用Java来实现SOAP请求并获取响应,具体我们...
在这个过程中,我们通常会使用OpenSSL命令行工具,然后通过Java程序来调用这些系统命令。下面将详细讲解这个过程以及涉及的相关知识点。 首先,OpenSSL是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现...
它允许指定命令行参数、环境变量以及重定向标准输入/输出流等。 #### 1.2 常见应用场景 - **自动化任务处理**:例如定时执行备份任务、日志清理等。 - **集成外部工具**:比如使用第三方的图形处理软件进行图片转换...
在Java开发中,有时我们需要与外部服务进行交互,如发送短信、获取数据等,这时就会用到Web Service。本文将详细介绍如何使用HttpClient和XFire这两种不同的库来调用Web Service,特别是针对短信接口的调用。 首先...
标题提到的“用java调用.net接口的方法”就是解决这个问题的一种技术实践。以下将详细讲解三种主要的实现方式,以及如何通过提供的源代码进行操作。 首先,我们要理解Java和.NET之间的互操作性通常依赖于Web服务...
java调用Gmssl中国密接口进行对称与非对称加解密等运算,动态so库进行接口jni方式调用,采取接口形式对外暴露,方便对接系统调用相关java接口进行相关运算操作。
java版本调用HP-Socket服务端代码,包含jna包及5.0.2版本的HP-Socket的dll文件,采用的是非常新的HP-Socket版本,demo是整套java工程,导入eclipse修改HpSocket.java文件中的服务器的IP和端口就可以测试,里面还包含...
相比直接使用 `Runtime.exec()`,它能更好地处理输入/输出流,错误处理和进程生命周期管理。 4. **使用 Py4J**: Py4J 是一个强大的库,允许 Java 程序通过 JVM(Java Virtual Machine)边界调用 Python 对象。它...