System.out в файл в Java - PullRequest
47 голосов
/ 17 мая 2010

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

Есть ли способ перенаправить вывод приложения в файл из командной строки в Java?

Ответы [ 7 ]

75 голосов
/ 17 мая 2010

Вы можете использовать перенаправитель потока вывода, который поддерживается командной строкой Windows, * nix shells, например,

java -jar myjar.jar > output.txt

В качестве альтернативы, поскольку вы запускаете приложение изнутри виртуальной машины, вы можете перенаправить System.out изнутри самой Java. Вы можете использовать метод

System.setOut (PrintStream ps)

Что заменяет стандартный поток вывода, поэтому все последующие вызовы System.out переходят в указанный вами поток. Вы можете сделать это до запуска вашего упакованного приложения, например, звонить System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("output.txt"))));

Если вы используете оболочку, которую вы не можете изменить, создайте свою собственную оболочку. Итак, у вас есть обертка FEST -> обертка перенаправителя потока -> проверенное приложение.

Например, вы можете реализовать простую оболочку, подобную этой:

public class OutputRedirector
{
   /* args[0] - class to launch, args[1]/args[2] file to direct System.out/System.err to */
   public static void main(String[] args) throws Exception
   {  // error checking omitted for brevity
      System.setOut(outputFile(args(1));
      System.setErr(outputFile(args(2));
      Class app = Class.forName(args[0]);
      Method main = app.getDeclaredMethod("main", new Class[] { (new String[1]).getClass()});
      String[] appArgs = new String[args.length-3];
      System.arraycopy(args, 3, appArgs, 0, appArgs.length);
      main.invoke(null, appArgs);
   }
   protected PrintStream outputFile(String name) {
       return new PrintStream(new BufferedOutputStream(new FileOutputStream(name)), true);
   }
}

Вы вызываете его с 3 дополнительными параметрами - класс Main для запуска и вывод / ошибка.

46 голосов
/ 13 ноября 2012

При использовании этого конструктора:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")));

не забудьте установить для автоматической очистки значение true, т. Е .:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")), true);

в противном случае вы можете получить пустые файлы даже после завершения вашей программы.

27 голосов
/ 17 мая 2010

Да, вы можете установить желаемый файл следующим образом.

try {
    System.setOut(new PrintStream(new File("output-file.txt")));
} catch (Exception e) {
     e.printStackTrace();
}
9 голосов
/ 03 марта 2016

System.out.println () используется для печати сообщений на консоли.

Система - это класс, определенный в пакете java.lang. out является экземпляром PrintStream, который является открытым и статическим членом класса System. Поскольку все экземпляры класса PrintStream имеют открытый метод println ().

System.out - это статический PrintStream , который пишет в консоль. Мы можем перенаправить вывод в другой PrintStream, используя метод System.setOut () , который принимает PrintStream в качестве параметра.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class SetPrintStream {
  public static void main(String[] args) throws FileNotFoundException{
           System.out.println("Print on console");

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

           File file = new File("file.txt");
           FileOutputStream fos = new FileOutputStream(file);

           // Create new print stream for file.
           PrintStream ps = new PrintStream(fos);

           // Set file print stream.
           System.setOut(ps);
           System.out.println("Print in the file !!");

           // Set console print stream.
           System.setOut(ps_console);
           System.out.println("Console again !!");
 }
}

Output:
Print on console
Console again !!
new file.txt will be created.

Для получения дополнительной информации см. Мой блог:

http://javaexplorer03.blogspot.in/2016/02/how-do-i-redirect-standard-output-to.html

7 голосов
/ 28 февраля 2012

Чтобы улучшить ответ «vijay.shad», я использовал приведенный ниже код, чтобы направить файл в Домашний каталог в Linux или MyDocuments в Windows.

    try {
        System.setOut(new PrintStream(new File(FileSystemView.getFileSystemView()
                .getDefaultDirectory().toString()
                + File.separator + "output-file.txt")));
    } catch (Exception e) {
         e.printStackTrace();
    }
1 голос
/ 17 августа 2016
    File file = new File("xyz.txt");        
    PrintStream printStreamToFile = new PrintStream(file);
    System.setOut(printStreamToFile);
    System.out.println("Hello I am writing to File xyz.txt");
0 голосов
/ 17 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...