我有一个特殊的问题。我有一个使用以下命令运行的Java程序:
cat input_file_name | ./script_name > file_output_name
script_name
脚本只是:java myprogram
我的问题是:如何在没有“放入file_output_name文件”的情况下在控制台中打印出某些内容(因为> file
将所有System.out.prints
放入该文件中
我知道这是可能的,因为已经有一些来自我正在使用java程序的库中的某些类。但是我无法找到这些打印的确切来源,因此我不知道它是如何编码的。
感谢您的帮助。
答案 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,其中说明了详细说明如何做。