3

我正在 Eclipse 中调试 Java 程序。该程序通常将二进制数据写入其标准输出,但它可以将错误消息和堆栈跟踪写入其标准错误流。

我想将二进制数据重定向到一个文件,同时继续在控制台中显示标准错误输出。从命令行运行时,这很简单。Eclipse下可以吗?

到目前为止,我只知道如何将标准输出和标准错误重定向到同一个文件。除了向程序添加新的命令行选项外,我看不到将两者分开的方法。


相关:Eclipse 中的 I/O 重定向?

4

4 回答 4

4

您可以尝试将您的流标准输出重定向到其中包含 SWT 文本的自定义视图,而将标准错误留给默认控制台。
看到这个线程

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;


import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;


public class ConsumeSysout {


    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        final Text text = new Text(shell, SWT.NONE);
        shell.open();


        OutputStream out = new OutputStream() {
            @Override
            public void write(int b) throws IOException {
               text.append(Character.toString((char) b));
            }
        };
        System.setOut(new PrintStream(out));


        System.out.println("Hello World!");


        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}
于 2009-11-26T16:11:08.180 回答
2

来自(http://www.eclipsezone.com/eclipse/forums/t52910.html):

如果有人想查看已在 Eclipse 中部署的插件写入 System.out/System.err 的字符串,则可以通过在命令提示符下以调试模式运行 Eclipse 来完成eclipse.exe -debug。否则,您可以稍作修改以捕获 JVM(运行 Eclipse)的 stderr/stdout,如Redirect stdout and stderr of Eclipse to a file(WinXP 上的 Eclipse 3.0)中所述

如果您在调试模式下运行 Eclipse,您应该能够从命令行启动它并包含一个 stderr 重定向。在 Unix 中,它将是“命令 2> 文件”。

该线程有一些相关内容:Redirect STDERR / STDOUT of a process AFTER it's been started, using command line?

此链接更特定于 DOS/Windows:Stderr

DOS shell command.com 不提供重定向标准错误的方法。因此,不可能将程序打印到 stderr 的消息保存到文件或通过管道传输到程序中。"foo >out" 只重定向 foo 的标准输出,而不是标准错误。后者仍然进入控制台。

由于 stderr 通常是打印重要错误消息的地方,这是非常不幸的,因为这使我们无法检测无人值守作业中的错误。

所以你会怎么做?一种解决方案是切换到 Unix,其中 shell 允许重定向 stderr。对于 sh 及其衍生物,使用

foo >out 2>&1

将 foo 的 stdout 和 stderr 都保存到 out 中。同样,使用

foo 2>&1 | bar

将 foo 的 stdout 和 stderr 都通过管道传输到 bar 中。如果您被 DOS 困住,那么您需要的是 Stderr。

Stderr 运行命令并将其 stderr 合并到其 stdout 中。因此,重定向或管道 stdout 等同于对 stderr 做同样的事情。

我将不得不继续寻找 Windows 解决方案。PowerShell 已变得流行,可能值得一试。

于 2009-12-02T23:25:10.380 回答
1

好吧,您可以将 System.out 替换为您自己的 PrintStream 写入文件。我只是即兴写了这个,所以也许它并不完全正确,但你明白了:

FileOutputStream fos = new FileOutputStream("c:\myfile.bin");
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintStream ps = new PrintStream(bos);
System.out = ps;

那,或者非常相似的东西应该可以解决问题。通常进入标准输出的所有输出现在都将进入该文件(当您关闭程序时不要忘记 close() Printstream,否则它不会总是将最后的数据刷新到文件中。)

当然,如果你愿意,你也可以用 System.err 做同样的事情。

于 2009-11-19T04:14:03.307 回答
0

现在想到了两种在独立控制台中过滤 stdout/stderr 的解决方案(但它们不适用于二进制流,因此是 Community-Wiki 模式):

  • 要么不重定向任何东西(所有输出都在控制台中),并使用像Grep Console这样的插件来突出显示相关输出

    http://marianold.schedenig.name/grepconsole/img/grepconsole.png

  • 和/或重定向文件中的所有内容,并使用NTail 之类的插件并使用一些“过滤行”从日志文件显示中排除选定的行(这可能更接近您正在寻找的内容)。

    http://www.certiv.net/images/NTailScreenShot001.jpg

(您可以根据需要/想要定义多个 NTail 视图。)

于 2009-11-18T18:15:58.413 回答