System.out到java中的文件

Car*_*nco 48 java

我正在从另一个应用程序中运行一个应用程序用于测试目的.我想将测试应用程序的输出重定向到文件,因此我可以在每次测试后都有一个日志.

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

mdm*_*dma 76

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

java -jar myjar.jar > output.txt
Run Code Online (Sandbox Code Playgroud)

或者,当您从虚拟机内部运行应用程序时,您可以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);
   }
}
Run Code Online (Sandbox Code Playgroud)

您使用另外3个参数调用它 - 要运行的Main类,以及输出/错误指示.

  • 需要说明的是,这与Java本身无关,而是由shell提供的标准工具. (3认同)

小智 46

使用此构造函数时:

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

记得将autoflushing设置为true,即:

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

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


vij*_*had 27

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

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

  • 我知道这是一个非常古老的线程。有人可以解释一下 `System.setOut(new PrintStream(new File("output-file.txt")));` 和 `new PrintStream(new BufferedOutputStream(new FileOutputStream("output-file.txt"))) 之间的区别吗,正确);`?为什么一个人会选择另一个人?如果我问的问题很天真,我很抱歉,但我没有看到任何区别。我使用的是JDK8 (2认同)

小智 9

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.
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅我的博客

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


小智 7

为了改进"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();
    }
Run Code Online (Sandbox Code Playgroud)