我正在 Eclipse 中调试 Java 程序。该程序通常将二进制数据写入其标准输出,但它可以将错误消息和堆栈跟踪写入其标准错误流。
我想将二进制数据重定向到一个文件,同时继续在控制台中显示标准错误输出。从命令行运行时,这很简单。Eclipse下可以吗?
到目前为止,我只知道如何将标准输出和标准错误重定向到同一个文件。除了向程序添加新的命令行选项外,我看不到将两者分开的方法。
我正在 Eclipse 中调试 Java 程序。该程序通常将二进制数据写入其标准输出,但它可以将错误消息和堆栈跟踪写入其标准错误流。
我想将二进制数据重定向到一个文件,同时继续在控制台中显示标准错误输出。从命令行运行时,这很简单。Eclipse下可以吗?
到目前为止,我只知道如何将标准输出和标准错误重定向到同一个文件。除了向程序添加新的命令行选项外,我看不到将两者分开的方法。
您可以尝试将您的流标准输出重定向到其中包含 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();
}
}
来自(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 已变得流行,可能值得一试。
好吧,您可以将 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 做同样的事情。
现在想到了两种在独立控制台中过滤 stdout/stderr 的解决方案(但它们不适用于二进制流,因此是 Community-Wiki 模式):
要么不重定向任何东西(所有输出都在控制台中),并使用像Grep Console这样的插件来突出显示相关输出
和/或重定向文件中的所有内容,并使用NTail 之类的插件并使用一些“过滤行”从日志文件显示中排除选定的行(这可能更接近您正在寻找的内容)。
(您可以根据需要/想要定义多个 NTail 视图。)