知识大全 详细讲解怎样在Java中运行其它应用程序

Posted

篇首语:蹉跎莫遣韶光老,人生唯有读书好。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 详细讲解怎样在Java中运行其它应用程序相关的知识,希望对你有一定的参考价值。

详细讲解怎样在Java中运行其它应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  import java io *;    public class CommandWrapper    Process process;  Thread in;  Thread out;  public CommandWrapper(Process process)    this process = process;  final InputStream inputStream =  process getInputStream();  //final BufferedReader  r=new BufferedReader  (new InputStreamReader(inputStream));  final byte[] buffer = new byte[ ];  out = new Thread()    //String line;  int lineNumber= ;  public void run()    try   while (true)    int count = inputStream read(buffer);  System out println  (lineNumber+ : +new String  (buffer count ));  //line=r readLine();  //System out println  (lineNumber+ : +line);  lineNumber++;      catch (Exception e)          ;  final BufferedReader reader =  new BufferedReader  (new InputStreamReader(System in));  final OutputStream  outputStream = process getOutputStream();  in = new Thread()    String line;  public void run()    try    while (true)    outputStream write(  (reader readLine()+ \\n ) getBytes());  outputStream flush();      catch (Exception e)          ;      public void startIn()    in start();      public void startOut()    out start();      public void interruptIn()    in interrupt();      public void interruptOut()    out interrupt();      public static void main  (String[] args)    try    CommandWrapper mand  = new CommandWrapper  (Runtime getRuntime() exec( native ascii ));  mand startIn();  mand startOut();    catch (Exception e)    e printStackTrace();            我以native ascii为范例程序和网友给我的那个程序做了对比 发现如下几个在处理这个问题时需要注意的地方      由于不知道目标程序的输入输出顺序 因此只能建立两个单独的线程分别处理输入和输出 这样输入和输出就不会阻塞了 但是有些目标程序要求有特定的输入输出顺序 而经过这个类封装的结果是在任何状态下都可以输入 程序的任何输出也会被马上反映出来 这是构造通用类的第一个问题      不能直接使用I/O重定向 在最开始的时候我是考虑直接使用I/O重定向的 但是实际的情况是Process的I/O的定义刚好和我的预想相反 我们从Process取得的InputStream实际上是它的输出 而取得的OutputStream是它的输入 这样就无法进行I/O重定向了 必须我们进行编码来读取程序的输出和写入控制台的输入 (这里的I/O重定向是指想将它的I/O直接重定向到系统的I/O)     写入控制台的输入     outputStream write(  (reader readLine()+ \\n ) getBytes());  outputStream flush();    这里有两个问题值得注意 第一个是我们在控制台输入一行数据以后按下回车 那么语句reader readLine()可以正确的得到你的输入 为什么要加那个换行符呢?这是在测试的时候发现的问题 在以native ascii作为例子的时候发现不加这个的话它不能得到控制台的输入 但是我在替那位网友解决的问题的时候他的程序则没有这个问题     因此猜想可能是因为有的程序要求读取的一整行的数据(例如native ascii) 而大部分的命令行程序在编码的时候读取的是整数这样的值或者其他类型的值 他们是以空格或者其他的字符分隔的 因此就不需要那个额外的换行符(例如那位网友的程序读取的是一元二次方程的三个系数)     另外一个问题就是flush方法的使用 在最开始的时候没有想到要这样刷新进去 无论是否加换行符外部程序都无法读取写入的输入 后来才想到要调用一下这个方法 这个也是在我们输出的时候应该注意的一个问题 有些需要马上反应出来的输出一般都在写入以后要调用它 否则输出/输入不能马上反应出来      对于程序的输出 最开始我是构造的一个BufferedReader想以行为单位输出 对于那位网友的程序 结果证明不是很好用 但是以native ascii作为例子运行又没有问题 这个估计和外部程序的代码也有关系 如果外部程序没有输出换行符可能使用BufferedReader就会有问题 但是通过直接读取输出就没有问题了 另外需要注意的就是     System out println  (lineNumber+ : +new String  (buffer count ));    中严格来说应该是     System out println  (lineNumber+ : +new String  (buffer count));    之所以减一是因为读取输入的时候人为的多加了一个换行符 如果这个地方不减一就会多输出一个空行     基于以上的种种原因 要构造一个执行外部程序的包装器类不太好办 特别是文章中提到的几个问题 有时间和兴趣的朋友可以做一下测试 看看以上的问题和猜测是否正确     另外附上一段源代码 是一个fortran的程序     implicit none  real a b c  real d  real root root   print* 请输入一元二次方程  的系数a b c:   read(* *) a b c  d=b** *a*c  if(d>= ) then  root =( b+sqrt(d))/( *a)  root =( b sqrt(d))/( *a)  print* root = root   print* root = root   else  print* 一元二次方程没有实根!   end if  pause  end cha138/Article/program/Java/JSP/201311/19704

相关参考

知识大全 详细讲解Oracle数据库运行错误的解决方法

详细讲解Oracle数据库运行错误的解决方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Or

知识大全 在Eclipse中运行带参数的 Java 程序

在Eclipse中运行带参数的Java程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishi

知识大全 详细讲解Hibernate应用程序

详细讲解Hibernate应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文向大家介绍

知识大全 java线程简介(其它线程API详细信息)

java线程简介(其它线程API详细信息)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  wai

知识大全 怎样制作可执行的java程序

  常常在网上看到有人询问如何把java程序编译成exe文件通常回答只有两种一种是制作一个可执行的JAR文件包然后就可以像chm文档一样双击运行了而另一种是使用JET来进行  编译但是JET是要用钱买

知识大全 windows XP 系统中通过开始菜单中的“运行”命令一定要输入程序的详细路径么

windowsXP系统中通过开始菜单中的“运行”命令一定要输入程序的详细路径么?还是也可以只输入程序名?  以下文字资料是由(本站网www.cha138.com)小编为大

知识大全 让Java程序只运行一个实例

让Java程序只运行一个实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一个程序可以在内存里

知识大全 Java程序多进程运行模式的实例分析

Java程序多进程运行模式的实例分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一般我们在jav

知识大全 java中的分布式是什么意思,和在同一台电脑上运行的程序有什么区别?

java中的分布式是什么意思,和在同一台电脑上运行的程序有什么区别?分布式,你可以理解为子节点可以独立运行例子:你开一家店,你就是服务器-客户端的架构,哪天你的生意壮大了,你就开了十家分店,这就相当于

知识大全 Java多线程进程应对同一程序运行资源

Java多线程进程应对同一程序运行资源  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java多