【发布时间】:2009-11-18 17:43:18
【问题描述】:
我正在 Eclipse 中调试 Java 程序。该程序通常将二进制数据写入其标准输出,但它可以将错误消息和堆栈跟踪写入其标准错误流。
我想将二进制数据重定向到一个文件,同时继续在控制台中显示标准错误输出。从命令行运行时,这很简单。 Eclipse下可以吗?
到目前为止,我只知道如何将标准输出和标准错误重定向到同一个文件。除了向程序添加一个新的命令行选项之外,我看不到将两者分开的方法。
【问题讨论】:
我正在 Eclipse 中调试 Java 程序。该程序通常将二进制数据写入其标准输出,但它可以将错误消息和堆栈跟踪写入其标准错误流。
我想将二进制数据重定向到一个文件,同时继续在控制台中显示标准错误输出。从命令行运行时,这很简单。 Eclipse下可以吗?
到目前为止,我只知道如何将标准输出和标准错误重定向到同一个文件。除了向程序添加一个新的命令行选项之外,我看不到将两者分开的方法。
【问题讨论】:
您能否尝试将您的流标准输出重定向到其中包含 SWT 文本的自定义视图,而将标准错误留给默认控制台。
见this thread
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();
}
}
【讨论】:
发件人(http://www.eclipsezone.com/eclipse/forums/t52910.html):
如果有人想查看已在 Eclipse 中部署的插件写入 System.out/System.err 的字符串,则可以通过在命令提示符下以调试模式运行 Eclipse 作为eclipse.exe -debug 来完成。
否则,您可以按照 Redirect stdout and stderr of Eclipse to a file (Eclipse 3.0 on WinXP)
如果您在调试模式下运行 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 通常是 打印重要的错误信息, 这是非常不幸的,因为这 使我们无法检测到错误 无人值守的工作。
那你是做什么的?一种解决方案是 切换到 shell 允许的 Unix 一个重定向stderr。用 sh 和 它的衍生物,使用
foo >out 2>&1保存 foo 的 stdout 和 stderr 出去。同样,使用
foo 2>&1 | bar通过管道传输 foo 的 stdout 和 stderr 进酒吧。如果你被 DOS 卡住了, Stderr 是您所需要的。
Stderr 运行一个命令并合并它的 标准错误进入其标准输出。所以, 重定向或管道标准输出是 相当于做同样的事情 标准错误也是如此。
我将不得不继续寻找 Windows 解决方案。 PowerShell 已经流行起来,可能值得一试。
【讨论】:
2> nul 将标准错误重定向到空流。
好吧,您可以将 System.out 替换为您自己的 PrintStream 写入文件。我只是临时写下这个,所以也许它并不完全正确,但你明白了:
FileOutputStream fos = new FileOutputStream("c:\myfile.bin");
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintStream ps = new PrintStream(bos);
System.out = ps;
那个,或者类似的东西应该可以解决问题。通常进入标准输出的所有输出现在都将进入该文件(当您关闭程序时不要忘记 close() 打印流,否则它不会总是将最后的数据刷新到文件中。)
当然,如果你愿意,你也可以用 System.err 做同样的事情。
【讨论】:
现在想到了两种在独立控制台中过滤标准输出/标准错误的解决方案(但它们不适用于二进制流,因此是 Community-Wiki 模式):
要么不重定向任何东西(所有输出都在控制台中),并使用像 Grep Console 这样的插件来突出显示相关输出
和/或重定向文件中的所有内容,并使用像 NTail 这样的插件并使用一些“过滤行”从日志文件显示中排除选定的行(这可能更接近您正在寻找的内容)。
(您可以根据需要/想要定义多个 NTail 视图。)
【讨论】: