首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用System.setOut()重定向Runtime.getRuntime().exec()输出;

用System.setOut()重定向Runtime.getRuntime().exec()输出;
EN

Stack Overflow用户
提问于 2011-01-20 07:11:22
回答 4查看 45.8K关注 0票数 23

我有一个程序Test.java:

代码语言:javascript
复制
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception {
        System.setOut(new PrintStream(new FileOutputStream("test.txt")));
        System.out.println("HelloWorld1");
        Runtime.getRuntime().exec("echo HelloWorld2");
    }
}

这将把HelloWorld1和HelloWorld2打印到文件text.txt中。但是,当我查看该文件时,我只看到HelloWorld1。

  1. HelloWorld2去哪儿了?它消失得无影无踪了吗?
  2. 假设我也想将HelloWorld2重定向到test.txt。我不能只是在命令中添加一个">>test.txt“,因为我会得到一个文件已经打开的错误。那么我该怎么做呢?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-20 07:26:29

Runtime.exec的标准输出不会自动发送到调用方的标准输出。

类似这样的事情要做--访问派生进程的标准输出,读取它,然后将它写出来。请注意,派生流程的输出可用于使用流程实例的getInputStream()方法的父级。

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    System.setOut(new PrintStream(new FileOutputStream("test.txt")));
    System.out.println("HelloWorld1");

     try {
       String line;
       Process p = Runtime.getRuntime().exec( "echo HelloWorld2" );

       BufferedReader in = new BufferedReader(
               new InputStreamReader(p.getInputStream()) );
       while ((line = in.readLine()) != null) {
         System.out.println(line);
       }
       in.close();
     }
     catch (Exception e) {
       // ...
     }
}
票数 40
EN

Stack Overflow用户

发布于 2011-01-20 07:28:02

从JDK1.5开始,就有了java.lang.ProcessBuilder,它也可以处理std和err流。它可以说是java.lang.Runtime的替代品,你应该使用它。

票数 5
EN

Stack Overflow用户

发布于 2011-01-20 07:27:00

System.out不是您通过调用exec()产生的新进程的标准输出。如果您想查看"HelloWorld2“,则必须获取从exec()调用返回的进程,然后从中调用getOutputStream()。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4741878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档