5

我正在尝试从 Java 程序运行外部程序,但遇到了麻烦。基本上我想做的是:

 Runtime.getRuntime().exec("./extprogram <fileIn >fileOut");

但是我发现这不起作用 - Java 明显需要使用 aProcess输入和输出流以及其他我没有经验的东西。

我查看了互联网上的许多示例(其中许多来自 SO),似乎没有一个简单的标准方法可以做到这一点,对于那些不完全了解发生了什么的人来说,可能非常令人沮丧。

我在尝试根据其他人的代码示例构建自己的代码时也遇到了麻烦,因为通常大多数其他人似乎 1. 对重定向不感兴趣stdin,并且 2. 不一定重定向stdout到文件,而是System.out.

那么,任何人都可以向我指出任何用于调用外部程序和重定向的简单代码模板的方向stdinstdout?谢谢。

4

3 回答 3

9

你可以尝试这样的事情:

ProcessBuilder pb = new ProcessBuilder();
pb.redirectInput(new FileInputStream(new File(infile));
pb.redirectOutput(new FileOutputStream(new File(outfile));
pb.command(cmd);
pb.start().waitFor();
于 2012-07-04T23:09:34.697 回答
7

如果你必须使用Process,那么这样的东西应该可以工作:

public static void pipeStream(InputStream input, OutputStream output)
   throws IOException
{
   byte buffer[] = new byte[1024];
   int numRead = 0;

   do
   {
      numRead = input.read(buffer);
      output.write(buffer, 0, numRead);
   } while (input.available() > 0);

   output.flush();
}

public static void main(String[] argv)
{
   FileInputStream fileIn = null;
   FileOutputStream fileOut = null;

   OutputStream procIn = null;
   InputStream procOut = null;

   try
   {
      fileIn = new FileInputStream("test.txt");
      fileOut = new FileOutputStream("testOut.txt");

      Process process = Runtime.getRuntime().exec ("/bin/cat");
      procIn = process.getOutputStream();
      procOut = process.getInputStream();

      pipeStream(fileIn, procIn);
      pipeStream(procOut, fileOut);
   }
   catch (IOException ioe)
   {
      System.out.println(ioe);
   }
}

笔记:

  • 一定要去close溪流
  • 将其更改为使用缓冲流,我认为原始Input/OutputStreams实现可能一次复制一个字节。
  • 进程的处理可能会根据您的特定进程而改变:cat是管道 I/O 的最简单示例。
于 2012-07-04T23:33:30.923 回答
0

你试过 System.setIn 和 System.setOut 吗?自 JDK 1.0 以来一直存在。

public class MyClass
{
    System.setIn( new FileInputStream( "fileIn.txt" ) );
    int oneByte = (char) System.in.read();
    ...

    System.setOut( new FileOutputStream( "fileOut.txt" ) );
    ...
于 2012-07-05T00:11:13.360 回答