Java 如何获取映射到标准输出/错误的文件?

Java 如何获取映射到标准输出/错误的文件?,java,Java,启动Java程序时,使用以下命令(unix)将标准out和err重定向到某些特定文件: 有没有办法从Java程序中读取这些信息?我的要求是在与标准输出相同的目录中写入一个文件 unix脚本实际上是启动java批处理程序的脚本。Java程序本身使用log4j,但会登录到控制台,因此日志最终会写入这些文件。我无法在log4j配置中指定文件追加器,因为文件的路径由unix脚本而不是Java程序确定。理想情况下,unix脚本应该生成Java程序使用的log4j配置文件,但这相当复杂;这是不可能的。如果您

启动Java程序时,使用以下命令(unix)将标准out和err重定向到某些特定文件:

有没有办法从Java程序中读取这些信息?我的要求是在与标准输出相同的目录中写入一个文件


unix脚本实际上是启动java批处理程序的脚本。Java程序本身使用log4j,但会登录到控制台,因此日志最终会写入这些文件。我无法在log4j配置中指定文件追加器,因为文件的路径由unix脚本而不是Java程序确定。理想情况下,unix脚本应该生成Java程序使用的log4j配置文件,但这相当复杂;这是不可能的。

如果您的程序关心文件名,您应该将输出和错误文件作为参数提供给程序,而不是重定向stdout和stderr


毕竟,您的程序完全有可能在不重定向输出的情况下运行—在这种情况下,您希望将这个额外的文件写入何处?

不可能这样做,因为您只能检索文件本身。您可以查找该文件,但通过硬链接,该文件可以出现在多个目录中。如果您需要此解决方案,我建议您这样做

java org.company.MyClass /path/to/some/file /path/to/err/file
并使用System.setOut和System.setErr将输出定向到文件。这样你也会知道他们的道路

另一种方法是这样做

java org.company.MyClass /path/to/some 1>/path/to/some/file 2>/path/to/err/f

您不能这样做,因为这是处理此问题的UNIX shell。据我所知,没有一种UNIX工具能够实现您的建议


您应该使用日志框架或(较低级别)将System.err和System.out设置为FileOutputStream来重定向java程序本身内的输出。然后,您可以使用一个参数指定这个“stdout文件”,该参数可以在java程序中恢复。

不要使用stdout/srderr


使用可配置的日志框架(jog4j、java.util.logging等)并配置文件appender。否则,如果要删除文件(如果文件被锁定),您可能会创建大量日志文件,并且必须停止应用程序.

为什么不在发出命令之前将cd放入目标目录中?我甚至认为最好将System.out和System.err用法一起删除,并用日志记录的用法替换它们framework@Robin:这取决于输出是什么,但是的,很有可能。当然,这对“我把另一个文件放在哪里”的问题没有帮助:)
java org.company.MyClass /path/to/some 1>/path/to/some/file 2>/path/to/err/f