Захват содержимого стандартного вывода в Java - PullRequest
14 голосов
/ 22 марта 2011

Я вызываю функцию, которая печатает некоторую строку в моей консоли / стандартный вывод.Мне нужно захватить эту строку.Я не могу ни изменить функцию, которая выполняет печать, ни изменить поведение во время выполнения посредством наследования.Я не могу найти какие-либо заранее определенные методы, которые позволили бы мне сделать это.

Хранит ли JVM буфер печатного содержимого?

Кто-нибудь знает метод Java, который поможетмне

Ответы [ 3 ]

30 голосов
/ 22 марта 2011

Вы можете перенаправить стандартный вывод, вызвав

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);
  }
}
4 голосов
/ 22 марта 2011

Вы можете временно заменить System.err или System.out потоком, который записывает в строковый буфер.

2 голосов
/ 22 марта 2011
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");

        }

    }
}
...