System.out для файла в java

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

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

Ответ 1

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

java -jar myjar.jar > output.txt

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

System.setOut(PrintStream ps)

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

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

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

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);
   }
}

Вы вызываете его с тремя дополнительными параметрами - основным классом для запуска, а также директивой output/error.

Ответ 2

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

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

не забудьте установить autoflushing в true, т.е.:

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

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

Ответ 3

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

try {
    System.setOut(new PrintStream(new File("output-file.txt")));
} catch (Exception e) {
     e.printStackTrace();
}

Ответ 4

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

    try {
        System.setOut(new PrintStream(new File(FileSystemView.getFileSystemView()
                .getDefaultDirectory().toString()
                + File.separator + "output-file.txt")));
    } catch (Exception e) {
         e.printStackTrace();
    }

Ответ 5

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

Ответ 6

    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");