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