龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java中运行其它程序方法的实例详解[组图]

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
由于前段时间一个网友写信询问如何在运行其他可执行程序时将控制台的输入提交到它想运行的程序,由于考虑到他的非凡情况就帮他弄了一下,刚开始想着这个问题应该比较简单,但
  由于前段时间一个网友写信询问如何在运行其他可执行程序时将控制台的输入提交到它想运行的程序,由于考虑到他的非凡情况就帮他弄了一下,刚开始想着这个问题应该比较简单,但是在实际做的过程中才发现有很多陷阱,而且似乎不能弄一个非常通用的东西出来。 <!-- frame contents -->
<!-- /frame contents --> 下面的代码是我想做出的一个通用封装器的尝试:
  

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[1024];
  out = new Thread()
  {
  //String line;
  int lineNumber=0;
  public void run()
  {
  try {
  while (true)
  {
  int count = inputStream.read(buffer);
  System.out.println
  (lineNumber+":"+new String
  (buffer, 0, count-1));
  //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()+" ").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 command =
  new CommandWrapper(Runtime.getRuntime().
  exec("native2ascii"));
  command.startIn();
  command.startOut();
  }
  catch (Exception e) {
  e.printStackTrace();
  }
  }
  
  }


  我以native2ascii为范例程序和网友给我的那个程序做了对比,发现如下几个在处理这个问题时需要注重的地方:
  

  1、由于不知道目标程序的输入输出顺序,因此只能建立两个单独的线程分别处理输入和输出,这样输入和输出就不会阻塞了。 <!-- frame contents -->
<!-- /frame contents --> 但是有些目标程序要求有特定的输入输出顺序,而经过这个类封装的结果是在任何状态下都可以输入,程序的任何输出也会被马上反映出来,构造通用类的第一个问题。
  
  
精彩图集

赞助商链接