Java调用系统命令学习(二)
经过上一篇的学习,应该对Java中的Runtime类的exec方法了大致的了解,也知道应该如何去使用了吧。
首先学习下:Process类。
简单地测试一下:
调用Javac命令,并查看执行命令的返回值,并输出到控制台上去。
import java.io.IOException;
class Exec_Javac{
public static void main(String []args)throws IOException{
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("javac");
int exitValue = p.exitValue();
System.out.println("Process exitValue="+exitValue);
}
}
//执行结果:
Exception in thread "main" java.lang.IllegalThreadStateException: process hasn't exited
at java.lang.UNIXProcess.exitValue(UNIXProcess.java:172)
at Exec_Javac.main(Exec_Javac.java:6)
呵呵,从上面,我们可以知道,并不能得到我们想要的结果。至于什么原因呢。
下面一段话直接引用别人的:(它比较详细地讲述了出错的原因)
这里主要的问题就是错误的调用了exitValue来取得外部命令的返回值(呵呵,这个错误我也曾经犯过),因为
exitValue这个方法是不阻塞的,程序在调用这个方法时外部命令并没有返回所以造成了异常的出现,这里是由另外的方法来等待外部命令执行完毕的,就
是waitFor方法,这个方法会一直阻塞直到外部命令执行结束,然后返回外部命令执行的结果,作者在这里一顿批评设计者的思路有问题,呵呵,反正我是无
所谓阿,能用就可以拉。但是作者在这里有一个说明,就是exitValue也是有好多用途的。因为当你在一个Process上调用waitFor方法时,
当前线程是阻塞的,如果外部命令无法执行结束,那么你的线程就会一直阻塞下去,这种意外会影响我们程序的执行。所以在我们不能判断外部命令什么时候执行完
毕而我们的程序还需要继续执行的情况下,我们就应该循环的使用exitValue来取得外部命令的返回状态,并在外部命令返回时作出相应的处理。
那么好,既然出错了,当然要修改啦:
改为如下:
import java.io.IOException;
class Exec_Javac{
public static void main(String []args)throws IOException,InterruptedException{
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("javac");
//i
相关文档:
用Java连接SQL Server2000数据库有多种方法,下面介绍其中最常用的两种(通过JDBC驱动连接数据库)。
1. 通过Microsoft的JDBC驱动连接。此JDBC驱动共有三个文件,分别是mssqlserver.jar、msutil.jar和msbase.jar,可以到微软的网站去下载(http://www.microsoft.com/downloads/details.aspx?FamilyId=07287B11-0502-461A-B ......
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为:
并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnal ......
Java基础小结(数值类型转换规则)
一 数值类型转换规则
数值型数据进行运算时,如果操作数的类型不同或操作数的类型均低于int型,则
会进行自动类型转换处理,具体规则如下:
1)如果两个操作数中有一个是double型,则系统先将另一个操作数的值转换为double
型,然后再进行运算,否则
2)如果两个操作数中有一个是float ......
呵呵。。
import java.io.*;
class Exec{
public static void main(String []args)throws IOException{
//Linux系统命令:ls -l
String command = "ls -l";
//获取当前系统的环境。
Runtime rt = Runtime.getRuntime();
......
Java杂谈(六)
这篇是笔者打算写的J2se部分的最后一篇了,这篇结束之后,再写J2ee部分,不知道是否还合适写在这个版块?大家可以给点意见,谢谢大家对小弟这么鼓励一路写完前六篇Java杂谈的J2se部分。最后这篇打算谈一谈Java中的RMI机制和JVM沙箱安全框架。&nbs ......