当前位置: 首页 > 知识库问答 >
问题:

使用来自Java的重定向标准输入和标准输出运行外部程序

匡祖鹤
2023-03-14

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

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

然而,我发现这是行不通的——Java apparent ls需要使用一个< code>Process来处理输入和输出流以及其他我不熟悉的东西。

我在互联网上看到了许多例子(其中许多来自SO),但似乎没有一个简单的标准方法来做到这一点,这对于一个不完全了解情况的人来说,可能会很沮丧。

我也很难从其他人的代码中构建自己的代码,因为一般来说,大多数其他人1。对重定向< code>stdin不感兴趣。不必将< code>stdout重定向到文件,而是重定向到< code>System.out。

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

共有3个答案

胡元明
2023-03-14

你试过System.set和System.set吗?从JDK 1.0开始就存在了。

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

    System.setOut( new FileOutputStream( "fileOut.txt" ) );
    ...
贺宝
2023-03-14

如果您必须使用进程,那么应该可以这样做:

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);
   }
}

注意:

  • 请务必关闭
  • 将其更改为使用缓冲流,我认为原始输入/输出流实现可以一次复制一个字节。
  • 进程
  • 的处理可能会根据您的特定进程而改变:cat 是管道 I/O 的最简单示例。
南门志
2023-03-14

你可以试试这样的方法:

ProcessBuilder pb = new ProcessBuilder();
pb.redirectInput(new FileInputStream(new File(infile));
pb.redirectOutput(new FileOutputStream(new File(outfile));
pb.command(cmd);
pb.start().waitFor();
 类似资料:
  • 问题内容: 是否可以在Python中临时重定向stdout / stderr(即在方法期间)? 编辑: 当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向 ;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。 有什么办法吗? 问题答案: 要解决某些函数可能已将流作为局部变量缓存的问题,因此替换全局变

  • 问题内容: 在Linux 3.0 / C ++下: 我想要一个执行以下操作的函数: 显然上述方法不起作用,但是您可以理解。我有一个字符串s,我希望将其作为应用程序“ foo”的子进程执行的标准输入传递,然后将其标准输出记录到字符串r中,然后将其返回。 我应该使用linux syscall或posix函数的什么组合? 问题答案: eerpini提供的代码无法正常工作。请注意,例如,之后将使用在父级中

  • 回顾一下我们写的第一个 Rust 程序就是带副作用的,其副作用就是向标准输出(stdout),通常是终端或屏幕,输出了 Hello, World! 让屏幕上这几个字符的地方点亮起来。println! 宏是最常见的输出,用宏来做输出的还有 print!,两者都是向标准输出(stdout)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用

  • 问题内容: 我有一个奇怪的问题,如果可以解决,那就太好了。出于调试目的(以及其他一些目的),我在标准输出上编写了控制台Java应用程序的日志。在标准输出上写一些内容,在标准错误上打印一些错误,例如错误。问题是这两个没有完全同步,因此打印线的顺序并不总是正确的。我猜这是因为打印了很多东西,并且碰巧一个输出的缓冲区已满,所以其他输出在第一个输出刷新其缓冲区之前就已打印出来。 例如,我想这样写: 有时打

  • 我是Java的初学者。学习罗伯特·塞奇威克的《Java导论》 我尝试在Netbeans中编译以下代码。 } 我收到了这个错误。我已将文件放置在标准位置。java 线程“main”java.lang.RuntimeException中的异常:无法编译的源代码-错误的sym类型:示例。StdIn.is在示例中为空。verage.main(verage.java:16)Java结果:1 BUILD SU

  • 我最近想出了如何在汇编中写入 stdout,但现在无法从 stdin 中读取,并将我读取的内容输出回 stdout。这是我到目前为止的代码: 我很确定我看错了。我很确定和的行为没有达到预期(如果我将 替换为 次),这是导致我的问题的原因(当我输入输入并点击return时,它什么也不显示)。 我已经摸索了一段时间了,希望能得到任何帮助。(我这么做只是为了了解这不是家庭作业)。 我的问题本质上是我做错