当前位置: 首页 > 面试题库 >

使用Java重定向的stdin和stdout运行外部程序

葛炯
2023-03-14
问题内容

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

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

但是,我发现这是行不通的-Java清单需要使用Process带有输入和输出流以及其他我没有经验的东西。

我看了互联网上的许多示例(其中许多来自SO),并且似乎没有一种简单的标准方法来完成此操作,对于不完全了解正在发生的事情的人来说,可能非常令人沮丧。

我也很难在其他人的代码示例上构建自己的代码,因为通常看来,大多数其他人1.对重定向不感兴趣stdin,并且2.不一定重定向stdout到文件,而是重定向到文件。System.out

因此,任何人都可以向我指出任何用于调用外部程序和重定向stdin以及的良好简单代码模板的方向stdout吗?谢谢。


问题答案:

如果必须使用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的最简单示例。


 类似资料:
  • 问题内容: 我试图重定向java中子进程的stdin和stdout,最终我将把输出转到JTextArea或其他东西。 这是我当前的代码, 输出如下所示: 我期望看到输出“ Hello World”字符串。也许是因为父进程的存活时间不够长? 我还希望能够发送和接收多个命令。 问题答案: 在尝试侦听输入流之前,您已经尝试写入输出流,因此您什么也没看到是有道理的。为使此成功,您将需要对两个流使用单独的线

  • 在 Linux 中,一切都只是文件。这意味着,对于控制台程序: 键盘表示为一个文件,Bash 从中读取你的输入。 显示器表示为一个文件,Bash向输出写入它。 让我们假设,你有一个程序可以计算文件中的行。你可以通过键入wc -l来调用它。现在尝试一下 没有发生什么事吧?它只是卡在那里。错了,它正在等待你的输入。这是它的工作原理: line_counter = 0 while end of file

  • 我正在尝试从 Java 程序运行外部程序,但遇到了问题。基本上我想做的是这样的: 然而,我发现这是行不通的——Java apparent ls需要使用一个< code>Process来处理输入和输出流以及其他我不熟悉的东西。 我在互联网上看到了许多例子(其中许多来自SO),但似乎没有一个简单的标准方法来做到这一点,这对于一个不完全了解情况的人来说,可能会很沮丧。 我也很难从其他人的代码中构建自己的

  • 我们必须编写一个 C 程序,该程序本质上将使用管道将一个命令/程序的 stdin 重定向到另一个命令/程序 stdout。如果命令行上的程序被传递了 . ls -l \; more,它应该将 的 stdout 重定向到 ,其中 是分隔符。这个程序应该适用于我们路径中的任何命令/程序,所以:. cat filename.c \; more,应该与键入:相同。 我的问题是,我的程序似乎不能正常执行,或

  • 问题内容: 在shell中,您可以执行重定向 等操作,但是启动程序后如何呢? 这就是我问这个问题的方式,在我的终端后台运行的程序不断输出令人讨厌的文本。这是一个重要的过程,因此我必须打开另一个shell以避免输入文本。我希望能够进行重定向或其他重定向,以便可以继续在同一外壳中工作。 问题答案: 除非关闭并重新打开您的tty(即注销并重新登录,这可能还会终止该过程中的某些后台进程),否则您只剩下一个

  • 我有一个程序,通过Pipe. SourceChannel将stdout、stderr和stdin传输到/从Bytes Buffers。 程序使用选择器注册每个通道。 循环中的程序定期遍历 selectedKeys 集中的每个键,这些键对应于 stdout、stderr 和 stdin。对于每个密钥,它确定密钥是否有效、可读或可写,如果是,则与 ByteBuffer 执行相应的 IO 操作 我的问题