【问题标题】:Resetting Standard output Stream重置标准输出流
【发布时间】:2011-07-17 09:44:13
【问题描述】:

我知道 Java 中有一个函数可以使用 System.setOut 方法将标准输出流设置为任何用户定义的值..

但是有什么方法可以将标准输出重置为之前存储的或标准输出?

【问题讨论】:

    标签: java io


    【解决方案1】:

    您可以通过FileDescriptor.out 获取标准输出的文件描述符。要重置标准输出以打印到控制台,您可以这样做

    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
    

    另一种方法是简单地保持原始对象,如下:

    PrintStream stdout = System.out;
    System.setOut(new PrintStream(logFile));
    
    // ...
    
    System.setOut(stdout);                   // reset to standard output
    

    【讨论】:

      【解决方案2】:

      这是一个老问题,但它一直出现在 Google 搜索中,我想更正它。您实际上可以通过使用FileDescriptor 类来获得它。调用 new PrintStream(new FileOutputStream(FileDescriptor.out))) 应该会给你一些打印到标准输出的东西。

      import java.io.FileDescriptor;
      import java.io.FileOutputStream;
      import java.io.PrintStream;
      
      
      public static void main(String [] args) {
          System.err.println("error.");
          System.out.println("out.");
          System.setOut(System.err);
          System.out.println("error?");
          System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
          System.out.println("out?");
      }
      

      【讨论】:

      • 您能否澄清接受的答案是否不正确(即System.setOut(stdout); 是否按预期工作)?与简单地存储原始流相比,您的方法有什么好处吗?另外,我注意到System.out 之类的都标记为final,想知道您是否可以提供任何关于Java 如何在幕后处理setOut() 的见解。
      • System.outSystem.err 由底层原生 C 代码处理。它们被标记为final,这样它们的指针值就不会在没有虚拟机的本机部分“注意到”的情况下发生变化。需要提供的setOut() 方法让native 部分调整其内部引用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2012-08-22
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多