- 浏览: 676604 次
- 性别:
- 来自: 深圳
最新评论
-
fingerplay:
请问一下,第一份,逻辑树,就是代码里可以操纵的,例如更改lay ...
UIView与CALayer -
ok_lyc:
分享到哪里去了
iPhoneUIFont各种字体 -
lliiqiang:
我的个人理解:wait方法是在java虚拟机层面上在获取对象锁 ...
JAVA多线程同步wait、notify、synchronized -
milixw:
谢谢分享,就在找这个
iphone 推送通知 java 实现 -
wsqwsq000:
你的log4j包不行,上网搜一下:log4j-1.2.16.j ...
iphone 推送通知 java 实现
view plaincopy to clipboardprint?
import java.io.*;
class Exec{
public static void main(String []args)throws IOException{
//Linux系统命令:ls -l
String command = "ls -l";
//获取当前系统的环境。
Runtime rt = Runtime.getRuntime();
//执行
Process p = null;
p = rt.exec(command);
//获取执行后的数据
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String msg = null;
//输出。
while((msg = br.readLine())!=null){
System.out.println(msg);
}
br.close();
}
}
import java.io.*;
class Exec{
public static void main(String []args)throws IOException{
//Linux系统命令:ls -l
String command = "ls -l";
//获取当前系统的环境。
Runtime rt = Runtime.getRuntime();
//执行
Process p = null;
p = rt.exec(command);
//获取执行后的数据
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String msg = null;
//输出。
while((msg = br.readLine())!=null){
System.out.println(msg);
}
br.close();
}
}
上面的代码比较简单:
其中分为几个步骤:
1.获取当前系统的运行环境。
2.在当前系统执行系统命令。
3.执行后,获取其执行后的数据。
4.输出数据。
5.结束。
========================================================================
首先学习下: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");
- //int exitValue = p.exitValue();
- int exitValue = p.waitFor();
- System.out.println("Process exitValue="+exitValue);
- }
- }
- //执行结果为
- Process exitValue=2
得到上面这个结果是我意想不到的。因为在Windows下执行,会一直阻塞在那里。
却我在Ubuntu里面执行时,却在编译时却却不过,
抛出了这样的异常:
Exec_Javac.java:7: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
int exitValue = p.waitFor();
^
1 error
后来加上InterrupedException才可以执行。可以是环境上的不同。虽然是输出了结果,但是因为异常中断才输出的结果。也不是我想要的结果。这个又是为什么呢?
以下又是引用别人的话:
JDK文档中对此有如此的解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。
文档引述完了,作者又开始批评了,他说JDK仅仅说明为什么问题会发生,却并没有说明这个问题怎么解决,这的确是个问题哈。紧接着作者说出自己的做法,就是在执行完外部命令后我们要控制好Process的所有输入和输出(视情况而定),在这个例子里边因为调用的是 Javac,而他在没有参数的情况下会将提示信息输出到标准出错,所以在下面的程序中我们要对此进行处理。
呵呵。。不是想要的结果。当然还是得改进啦。
代码如下:
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader ;
- import java.io.BufferedReader;
- class Exec_Javac{
- public static void main(String []args)throws IOException,InterruptedException{
- Runtime rt = Runtime.getRuntime();
- Process p = rt.exec("javac");
- //int exitValue = p.exitValue();
- //int exitValue = p.waitFor();
- InputStream is = p.getErrorStream();
- InputStreamReader isr = new InputStreamReader(is);
- BufferedReader br = new BufferedReader(isr);
- String line = null;
- System.out.println("<ERROR>");
- while((line = br.readLine())!=null){
- System.out.println(line);
- System.out.println("</ERROR>");
- int exitValue = p.waitFor();
- System.out.println("Process exitValue="+exitValue);
- }
- }
- }
- //执行结果:
- <ERROR>
- Usage: javac <options> <source files>
- </ERROR>
- Process exitValue=2
- where possible options include:
- </ERROR>
- Process exitValue=2
- -g Generate all debugging info
- </ERROR>
- Process exitValue=2
- -g:none Generate no debugging info
- </ERROR>
- Process exitValue=2
- -g:{lines,vars,source} Generate only some debugging info
- </ERROR>
- Process exitValue=2
- -nowarn Generate no warnings
- </ERROR>
- Process exitValue=2
- -verbose Output messages about what the compiler is doing
- </ERROR>
- Process exitValue=2
- -deprecation Output source locations where deprecated APIs are used
- </ERROR>
- Process exitValue=2
- -classpath <path> Specify where to find user class files and annotation processors
- </ERROR>
- Process exitValue=2
- -cp <path> Specify where to find user class files and annotation processors
- </ERROR>
- Process exitValue=2
- -sourcepath <path> Specify where to find input source files
- </ERROR>
- Process exitValue=2
- -bootclasspath <path> Override location of bootstrap class files
- </ERROR>
- Process exitValue=2
- -extdirs <dirs> Override location of installed extensions
- </ERROR>
- Process exitValue=2
- -endorseddirs <dirs> Override location of endorsed standards path
- </ERROR>
- Process exitValue=2
- -proc:{none,only} Control whether annotation processing and/or compilation is done.
- </ERROR>
- Process exitValue=2
- -processor <class1>[,<class2>,<class3>...]Names of the annotation processors to run; bypasses default discovery process
- </ERROR>
- Process exitValue=2
- -processorpath <path> Specify where to find annotation processors
- </ERROR>
- Process exitValue=2
- -d <directory> Specify where to place generated class files
- </ERROR>
- Process exitValue=2
- -s <directory> Specify where to place generated source files
- </ERROR>
- Process exitValue=2
- -implicit:{none,class} Specify whether or not to generate class files for implicitly referenced files
- </ERROR>
- Process exitValue=2
- -encoding <encoding> Specify character encoding used by source files
- </ERROR>
- Process exitValue=2
- -source <release> Provide source compatibility with specified release
- </ERROR>
- Process exitValue=2
- -target <release> Generate class files for specific VM version
- </ERROR>
- Process exitValue=2
- -version Version information
- </ERROR>
- Process exitValue=2
- -help Print a synopsis of standard options
- </ERROR>
- Process exitValue=2
- -Akey[=value] Options to pass to annotation processors
- </ERROR>
- Process exitValue=2
- -X Print a synopsis of nonstandard options
- </ERROR>
- Process exitValue=2
- -J<flag> Pass <flag> directly to the runtime system
- </ERROR>
- Process exitValue=2
- </ERROR>
- Process exitValue=2
哎,不管怎么说还是出来了结果,作者作了一下总结,就是说,为了处理好外部命令大量输出的情况,你要确保你的程序处理好外部命令所需要的输入或者输出。
其实呀。还有其他,下篇再讲啦。
这会总算得到结果啦。不过在ubuntu里面跟在windows里面得到的结果有点不一样。
大家注意下
发表评论
-
google开放的maps api接口
2012-01-12 22:51 1177google开放的Maps api接口,包括很多版 ... -
iphone中请求对应的Mime type
2011-09-21 10:03 2249Extension MIME type Desc ... -
Sina微博开放平台获得App key和App secret
2011-08-20 18:01 2208最近由于需要调用微博开放接口,花点时间研究。刚上手,希望与 ... -
HttpURLConnection调用服务器,servlet中request.getInputStream为空
2011-08-18 14:01 2076HttpURLConnection调用服务器,servlet中 ... -
求质数的算法
2011-07-09 21:22 3441求i到j之间的所有质数最笨的一种方法是把i到j之间的每一个数n ... -
saveToken(request)
2011-07-09 21:21 1031Struts的Token(令牌)机制能够很好的解决表单重复提交 ... -
Method类invoke方法的使用
2011-07-09 21:20 2349java.lang.reflect.Methodpubli ... -
Hibernate的session.flush做了什么呢?
2011-07-09 21:20 943这是在一次事务提交 ... -
Hessian
2011-07-09 21:19 1140Hessian是一个轻量级的remoting onhttp ... -
HttpInvoker远程调用实例
2011-07-09 21:18 1147一、服务器端: 1、服务接口与实现类 ... -
几种通讯协议的比较
2011-07-09 21:18 911一、综述 本文比较了RM ... -
序列化
2011-07-09 21:17 1128无意当中想到这个问题,然后google 一下。找到一篇对 s ... -
对象的序列化和反序列化
2011-07-09 21:17 1012当两个进程在进行远 ... -
spring机制
2011-07-09 21:17 1135提到spring,第一印象就是DI与IOC,虽然有概念上的 ... -
如何让页面自动加载js文件
2011-07-09 21:16 2490打开页面时,对比缓存中js中是否有需要加载的js,如果有直 ... -
ajax的xmlhttp
2011-07-09 21:15 1009什么是xmlhttp一种浏览器不离开页面主动向服务器请求数据的 ... -
vo,bo,po,dto,dao,pojo
2011-07-09 21:15 1403vo,bo,po,dto,dao,pojo PO: ... -
Hql传中文参数出现乱码解决办法
2011-07-09 21:15 1135Hql传中文参数出现乱码(同sql传中文参数出现乱码一样): ... -
js四舍五入
2011-07-09 21:14 1278/* * 四舍五入的相关问题 */ / ... -
Session.Clear()、Session.Abandon()的区别
2011-07-09 21:13 1769Session.Clear()就是把Session对象中的 ...
相关推荐
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
Java编译语言将Java代码编译成.class文件(只有一种形式),而C/C++语言将代码编译成01码,不同的操作系统的01码指令不同,这造成了不能跨平台,而Java将这个任务交给JVM,不同操作系统上的JVM将.class文件编译成不同...
北京动力节点-Java编程零基础教程-123-Java基本语法-方法递归调用-不使用递归解决阶乘问题.avi 北京动力节点-Java编程零基础教程-124-Java基本语法-方法递归调用-使用递归解决阶乘问题.avi 北京动力节点-Java编程...
invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法示例 localVariable.java 演示局部变量 localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 other...
1、本项目为IDEA 2021工具创建的Spring Boot项目。 2、程序使用的中间件有:redis、nginx、rtmp、ffmpeg。...6、本程序仅供学习交流,请勿用于任何商业场景,由于使用本程序造成的任何损失需自行承担。
Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
使用VC++6.0编写小型java编译/运行系统,需要Java JDK的支持,安装好JDK后简单设置一下路径就可以使用了。主要解决了编译运行小型Java程序时,需要不断输入命令的麻烦,只需要拖动文件就可以编译,使Java学习变得...
本科毕业设计项目,java课程设计,使用Vue+SpringBoot开发的图书管理系统,web全栈开发,适合个人学习、参考 技术栈: SpringBoot, Vue CLI3, element UI 用途 一套完整的增删改查,适合初学者克隆学习并长期增强...
涌入欢迎使用Influx - 开源命令管理系统,旨在为您执行命令语法解析背后的繁重工作。 Influx 是的延续。 有关如何将旧的命令处理程序更多信息,请参阅有关的页面快速链接- 托管 Influx 项目的自动构建 - API 文档...
是我学习Java一段时间后,根据我了解的 编译技巧制作的一个可以对Java源文件进行快速编译的小程序。 有了它我们就不必要:开始 输入 cmd 然后再转到当前盘,当前路径,再输入Javac 文件名.Java 也不用输入:...
学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种...
第10章 Java IO系统 10.1 输入和输出 10.1.1 InputStream的类型 10.1.2 OutputStream的类型 10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向...
我们先给系统配置一个JAVA_HOME的环境变量(目的是为了方便我们修改jdk的版本和第三方软件的调用).JAVA_HOME设为jdk的安装目录,如:D:\jdk1.6.0_21 2. 然后我们在为path配上jdk,设为%JAVA_HOME%\bin; classpath的...
第10章 Java IO系统 10.1 输入和输出 10.1.1 InputStream的类型 10.1.2 OutputStream的类型 10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向...
基于java开发的快递柜状态采集与控制系统前后端源码+数据库+项目使用说明 # 安装Vue cli npm install -g @vue/cli # 查看已安装Vue cli版本 vue --version 或者 vue -V # 卸载当前Vue cli npm uninstall @vue/cli # ...
2.14 Java系统API方法调用 14 2.15二进制基础 14 2.16 Java基础其他注意事项 14 面向对象 16 3.1类 16 3.2对象 16 3.3包 16 3.4方法及其调用 17 3.5引用 17 3.6访问控制(封装) 17 3.7构造器 17 3.8 super()、super...
第10章 Java IO系统 10.1 输入和输出 10.1.1 InputStream的类型 10.1.2 OutputStream的类型 10.2 增添属性和有用的接口 10.2.1 通过FilterInputStream从InputStream里读入数据 10.2.2 通过FilterOutputStream向...
可使用java.io.InputStreamReader 例: import java.io.InputStreamReader; import java.io.BufferedReader; class n{ public static void main(String[] args){ System.out.println("请输入一列文字,包括空格...