使用“> filename”时没有打印到文件的System.out.println

时间:2011-12-11 03:29:15

标签: java bash shell command-line redirectstandardoutput

我有一个特殊的问题。我有一个使用以下命令运行的Java程序:

cat input_file_name | ./script_name > file_output_name

script_name脚本只是:java myprogram

我的问题是:如何在没有“放入file_output_name文件”的情况下在控制台中打印出某些内容(因为> file将所有System.out.prints放入该文件中

我知道这是可能的,因为已经有一些来自我正在使用java程序的库中的某些类。但是我无法找到这些打印的确切来源,因此我不知道它是如何编码的。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

简单的答案是将这些消息写入System.err而不是System.out

这将起作用,因为>重定向标准输出而不是标准错误。 (您可以重定向标准错误,但shell语法不同;例如foo 2> /tmp/somefile。)

更复杂的替代方法是更改​​程序,以便可以使用输出文件的名称作为参数调用它。然后打开文件,将其包装在PrintWriter中并写入该流而不是System.out。通过一些重构,您应该能够构建程序,以便可以使用它。

答案 1 :(得分:1)

最简单的方法是使用System.err.println()代替System.out

它将转到另一个“设备”(stderr而不是stdout),并且不会被重定向。

答案 2 :(得分:1)

根据您所显示的内容,您只需重定向标准输出(标准输出)。你可以写一些标准错误(stderr),而不是让它显示在控制台上。在Java中,这可以通过System.err.println(...)和相关方法来完成。

答案 3 :(得分:0)

请注意,如果Java程序写入标准输出,它无法控制 其输出被重定向的位置,这取决于从命令行调用程序的方式。

如果清楚,只需从命令中删除> file_output_name部分,即可将程序的标准输出重定向到控制台。

或者,您可以使用tee命令将程序的输出重定向到控制台文件,请查看此article,其中说明了详细说明如何做。

相关问题