繁体   English   中英

System.out 到 java 中的文件

[英]System.out to a file in java

我正在从另一个应用程序内部运行一个应用程序以进行测试。 我想将被测试应用程序的输出重定向到一个文件,这样我就可以在每次测试后都有一个日志。

有没有办法将应用程序的输出从 java 中的命令行重定向到文件?

您可以使用 Windows 命令行支持的输出流重定向器, *nix shells ,例如

java -jar myjar.jar > output.txt

或者,当您从 vm 内部运行应用程序时,您可以从 java 本身内部重定向System.out 您可以使用该方法

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 类,以及输出/错误指示。

使用此构造函数时:

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

记得将 autoflushing 设置为 true,即:

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

否则即使在程序完成后,您也可能会得到空文件。

是的,您可以像这样设置所需的文件。

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

System.out.println() 用于在控制台上打印消息。

System 是在 java.lang 包中定义的一个类。 out 是 PrintStream 的一个实例,它是类 System 的公共和静态成员。 因为 PrintStream 类的所有实例都有一个公共方法 println()。

System.out是写入控制台的静态 PrintStream 我们可以使用System.setOut()方法将输出重定向到不同的 PrintStream,该方法将 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

为了改进“vijay.shad”响应,我使用下面的代码将文件定向到 Linux 中的主目录或 Windows 中的 MyDocuments。

    try {
        System.setOut(new PrintStream(new File(FileSystemView.getFileSystemView()
                .getDefaultDirectory().toString()
                + File.separator + "output-file.txt")));
    } catch (Exception e) {
         e.printStackTrace();
    }
    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");

或者您可以使用Class FileWriter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM