重定向";系统输出打印“;将Java程序输出到txt文件

重定向";系统输出打印“;将Java程序输出到txt文件,java,Java,在程序内重定向打印输出的代码: try { System.out.println("Print on console"); // Store console print stream. PrintStream ps_console = System.out; File file = new File("C:/Users/John/Desktop/compiletest/output" + trialNum + ".txt")

在程序内重定向打印输出的代码:

   try
   {
       System.out.println("Print on console");

       // Store console print stream.
       PrintStream ps_console = System.out;

       File file = new File("C:/Users/John/Desktop/compiletest/output" + trialNum + ".txt");
       FileOutputStream fos = new FileOutputStream(file);
       PrintStream ps = new PrintStream(fos);
       System.setOut(ps);
       System.out.println("Print in the file !!");

       // Set console print stream.
       //System.setOut(ps_console);
       System.out.println("Console again !!");
    }
    catch(Exception e)
    {
        System.out.println("Mission failed, we'll get em next time");
    }
如果该方法在我想要重定向其输出的程序中实现,则该方法可以很好地工作。在我的例子中,我想要一个单独的类,它将某个程序的输出重定向到txt文件


如果有一种更简单的方法来完成这项任务,我很想听听。

这似乎是一个完美的日志框架使用示例

您还可以使用许多其他库。一般来说,最好使用单独的文件流-如果您必须重定向
系统。out
,则在更改原始
打印流之前,最好保留原始
打印流
,以便在需要时仍然可以写入控制台:

PrintStream ORIGINAL_SOUT = System.out;
System.setOut(ps);

System.out.println("ABC"); // Uses file
ORIGINAL_SOUT.println("ABC"); // Uses console
日志框架的简单用法示例(来自第一个链接库):


我认为您应该创建一个临时函数,用它保存和存储您的数据,然后以您想要的方式执行您的事务。最后,您可以将数据永久存储在任何您想要的位置。这是我所知道的最有名的方法。你应该检查链接以便更容易理解

日志软件(如SLF4J、Log4J等)是更好的选择。
它有不同的文件创建方式、不同的文件格式、滚动追加器(基于日期/顺序/大小)、基于优先级的日志

您如何运行单独的程序?可以理解,您可能有理由这样更改程序中的输出,但这不是“最佳实践”。有几种方法可以捕获程序的输出并将其放入文件中。如果你强行处理这个问题,它就不再灵活(比如说,你不能在不重新编译整个程序的情况下阻止它写入文件)。如果这不是一个控制台程序,使用log4j等日志机制,而不是打印到
系统。out
一个单独的类,该类将某个程序的输出重定向到txt文件
-一个类不能引导另一个类重定向控制台输出,直到编写的代码接受相同的输出(例如接受outputfile作为执行参数并相应地执行)。由于这是一个系统属性,只能在执行开始之前设置。因此,在您的情况下,如果需要捕获其输出的类的代码无法更改,则没有希望。如果您能够/希望将其作为单独的进程运行,则这可能是的副本。“重定向System.out是一个更改,您在每次希望在控制台中输出时都必须还原。”您是否可以改为克隆流,并将其写入原始控制台?您的意思是将System.out设置为一个额外的PrintStream变量?是的,这是正确的,我将编辑问题以反映这一点。我的错误。
private static final Logger logger = LoggerFactory.getLogger(YourClass.class);

logger.debug("A message at DEBUG level");
logger.info("A message at INFO level");
logger.warn("A message at WARN level");
logger.error("A message at ERROR level");