首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取System.Out

读取System.Out
EN

Stack Overflow用户
提问于 2015-05-06 02:15:18
回答 3查看 2.4K关注 0票数 1

所以,我想要做的基本上是过滤所有通过System.outSystem.err传递的东西,是否有可能应用某种过滤器,或者创建自己的OutputStream来转移System.out,然后正常处理呢?

为了清晰起见,我需要阅读其他程序中的System.out内容,并对其进行操作,这样记录器就不是一个真正的选项,因为我无法控制其他程序将使用什么。

为了更清晰起见,我正在为一个更大的程序创建一个插件,它需要读取从其他插件写入System.out的所有内容。因为它是一个基于插件的系统,所以我的插件运行的进程总是和其他插件运行的进程相同。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-06 02:55:53

有些事情我还不清楚:您已经提到要“从其他程序( System.out )中阅读中的内容”。您的应用程序是在创建流程并希望监视其标准out/err,还是希望监视流程本身的标准out/err?

对于前一种情况,在创建流程之后,您可以获得它的输出输入错误流。

对于后一种情况,您可以用System.setOut(yourOwnOutputStream);代替您的Java进程之外的标准

但是,如果您试图处理完全不相关的流程流,我相信在调用者将stdout/stderr管道输送到您的流程(除非通过某些特定于平台的方法)之前,是不可能这样做的。

更新:

为了“拦截”标准,它与所有那些经典的“过滤输出流”没有什么不同。你能做的就是这样:

代码语言:javascript
复制
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;

class AnalyzingOutputStream extends FilterOutputStream {

    public AnalyzingOutputStream (OutputStream out) {
        super(out);
    }

    @Override
    public void write(int b) throws IOException {
          // do whatever analysis you want
          super.write(b);  // delegate to super class' write, which will 
                           // delegate to the filtered outputstream
    }
    // other overrides
}

为了使用它,您的主要逻辑应该做如下工作:

代码语言:javascript
复制
AnalyzingOutputStream analyzingOutputStream = new AnalyzingOutputStream(System.out);
System.setOut(analyzingOutputStream );

// then you can call your methods of AnalyzingOutputStream to do whatever you want
票数 5
EN

Stack Overflow用户

发布于 2015-05-06 02:19:52

您应该使用记录器,但是如果您不想要,van创建您自己的PrintStream,其中包含System.out。然后调用System.setOut(yourPrintStream)。

票数 0
EN

Stack Overflow用户

发布于 2015-05-06 03:30:56

要在Java中捕获来自另一个进程的所有输出,最简单的方法是自己使用Runtime.exec启动流程,这将为您提供一个具有getOutputStreamProcess对象。读取该流将为启动过程提供标准输出。

如果您试图捕获任意进程的输出,那么您前面还有一个更大的任务--这可能不是一个好主意。我不知道它在Windows上是如何工作的。在Linux下,您需要在您想要调查的进程(更可能是根进程)的同一个用户下运行。您可以查看/proc/<process id>/fd/<file descriptor>下任何给定进程的文件描述符。stdin、stdout和stderr的文件描述符分别为0、1和2。我建议你在这一点上停下来,重新考虑一下你想做什么。

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

https://stackoverflow.com/questions/30066313

复制
相关文章

相似问题

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