17

我正在调用一个在我的控制台/标准输出中打印一些字符串的函数。我需要捕获这个字符串。我无法修改正在执行打印的函数,也无法通过继承更改运行时行为。我找不到任何允许我这样做的预定义方法。

JVM 是否存储打印内容的缓冲区?

有谁知道可以帮助我的Java方法?

4

3 回答 3

33

您可以通过调用重定向标准输出

System.setOut(myPrintStream);

或者 - 如果您需要在运行时记录它,请将输出通过管道传输到文件:

java MyApplication > log.txt

另一个技巧 - 如果您想重定向并且无法更改代码:实现一个调用您的应用程序并启动该应用程序的快速包装器:

public class RedirectingStarter {
  public static void main(String[] args) {
    System.setOut(new PrintStream(new File("log.txt")));
    com.example.MyApplication.main(args);
  }
}
于 2011-03-22T10:12:20.490 回答
5

您可以将 System.err 或 System.out 临时替换为写入字符串缓冲区的流。

于 2011-03-22T10:13:49.567 回答
2
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class RedirectIO
{

    public static void main(String[] args)
    {
        PrintStream orgStream   = null;
        PrintStream fileStream  = null;
        try
        {
            // Saving the orginal stream
            orgStream = System.out;
            fileStream = new PrintStream(new FileOutputStream("out.txt",true));
            // Redirecting console output to file
            System.setOut(fileStream);
            // Redirecting runtime exceptions to file
            System.setErr(fileStream);
            throw new Exception("Test Exception");

        }
        catch (FileNotFoundException fnfEx)
        {
            System.out.println("Error in IO Redirection");
            fnfEx.printStackTrace();
        }
        catch (Exception ex)
        {
            //Gets printed in the file
            System.out.println("Redirecting output & exceptions to file");
            ex.printStackTrace();
        }
        finally
        {
            //Restoring back to console
            System.setOut(orgStream);
            //Gets printed in the console
            System.out.println("Redirecting file output back to console");

        }

    }
}
于 2011-03-22T10:15:01.867 回答