将System.out转换为java中的文件

将System.out转换为java中的文件,java,Java,出于测试目的,我正在从另一个应用程序内部运行一个应用程序。我想将已测试应用程序的输出重定向到一个文件,以便在每次测试后都有一个日志 有没有一种方法可以从java中的命令行将应用程序的输出重定向到文件?您可以使用Windows命令行支持的输出流重定向程序*nix shell,例如 java -jar myjar.jar > output.txt 或者,当您从vm内部运行应用程序时,您可以从java本身重定向System.out。你可以使用这个方法 它将替换标准输出流,因此对System.

出于测试目的,我正在从另一个应用程序内部运行一个应用程序。我想将已测试应用程序的输出重定向到一个文件,以便在每次测试后都有一个日志


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

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

java -jar myjar.jar > output.txt
或者,当您从vm内部运行应用程序时,您可以从java本身重定向
System.out
。你可以使用这个方法

它将替换标准输出流,因此对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个附加参数调用它—要运行的主类,输出/错误指示。

或者您可以使用。

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

try {
    System.setOut(new PrintStream(new File("output-file.txt")));
} catch (Exception e) {
     e.printStackTrace();
}
为了改进“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();
    }

使用此构造函数时:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt"))); 新的打印流(新的BufferedOutputStream(新的FileOutputStream(“file.txt”))); 请记住将自动刷新设置为true,即:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")), true); 新的PrintStream(新的BufferedOutputStream(新的FileOutputStream(“file.txt”)),true; 否则,即使在程序完成后,您也可能会得到空文件。

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

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

System.out是写入控制台的静态打印流。我们可以使用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.
有关更多信息,请参阅我的博客:


我认为这是不可行的-该应用程序目前正在写入System.Out,而且要明确的是,这与java本身无关,而是由shell提供的标准工具。我尝试过这样做,但最终得到的却是一个空的txt文件。出口仍然是去码头的。问题是,我正在使用一个名为FEST()的测试库中的帮助类。这个帮助类接受参数,然后可以将这些参数传递给应用程序。流重定向程序可能不太适合here@mdma-请参阅psu的评论(如下文所述)以获取答案修复。括号代替输入参数上使用的括号:(我需要将autoflushing设置为true,正如这里所指出的,它很可能是Java VM的外部解决方案,就像bash/sh中的文件描述符重定向一样(例如,“app.exe>file.log 2>&1”),除非您使用一些可配置的日志记录library@ben在支持自动刷新的PrintStream上。@Heeneee我看到了。但是我的评论是指在我发表评论后被修改的答案的一部分。另请参见答案的编辑历史。@ben Ok,明白了。但是当我从搜索结果。可能该评论现在应该删除了,因为它已经达到了它的目的?我知道这是一个非常旧的线程。有人能解释一下
System.setOut(新打印流(新文件(“output File.txt”));
新打印流(新缓冲输出流(新文件输出流(“output File.txt”))之间的区别吗;
?为什么一个会选择另一个?如果我问了一些幼稚的问题,我会道歉,但是我看不出有什么区别。我使用的是JDK8
    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");