Java:打印到控制台和文件
我有点问题 我正在运行一个包含许多类的程序,其中一个驱动程序运行所有这些类。当我运行驱动程序时,输出在控制台上打印得很好,但是我还需要将控制台的确切输出打印到文件中 但是,我似乎无法将控制台输出打印到文件中。我在这里试过这个建议 通过这样做Java:打印到控制台和文件,java,file,Java,File,我有点问题 我正在运行一个包含许多类的程序,其中一个驱动程序运行所有这些类。当我运行驱动程序时,输出在控制台上打印得很好,但是我还需要将控制台的确切输出打印到文件中 但是,我似乎无法将控制台输出打印到文件中。我在这里试过这个建议 通过这样做 import java.io.FileOutputStream; import java.io.PrintStream; public class Compiler { public static void main(String args[
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Compiler {
public static void main(String args[]){
try {
Parse parser = new Parse();
SemanticAnalyzer sAnalyzer = new SemanticAnalyzer();
String parserfile= parser.parsefile(args[0]);
sAnalyzer.semanticAnalysis(parserfile);
PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
但是文件仍然是空白的(可能是因为打印语句在其他文件中?)
有人有什么想法吗?创建一种方法,当输出任何打印到两个流的内容时,您可以在整个代码中使用该方法:
private void output(String text, PrintStream ps1, PrintStream ps2) {
ps1.println(text);
ps2.println(text);
}
并从代码中调用它:
PrintStream ps = new PrintStream(new FileOutputStream("output.txt"));
output("text1", System.out, ps);
output("text2", System.out, ps);
output("text3", System.out, ps);
ps.close();
我相信在我完成打字之前,这个问题会得到回答。。。然而,这里发生的事情是,您正在将(默认)输出流从控制台重定向到一个文件。如果要打印到这两个位置,则需要有一个实际记录到这两个位置的PrintStream。(或者,您可以查找日志记录解决方案——有几种)。然而,为了对其进行适度的学术研究: 您可以实现PrintStream或OutputStream(可能是更好的选择),通过实现接口并在每种情况下都记录到文件和控制台(yikes!)来实现这一点 上面@Voicu解释了一种更简单的方法,但感觉有点误导,那就是使用一种方法替换
System.out()代码>通过创建一个新方法来调用,该方法将这些流指定为输出的一部分。您可以轻松创建一个静态方法来解决此问题:
//Redirect via a method
public static PrintStream FILE = new PrintStream(new FileOutputStream("output.txt"));
public static void log(String x)
{
FILE.println(x);
System.out.println(x);
}
现在,一个糟糕但功能强大的解决方案看起来是这样的:
public static class DualStream extends PrintStream
{
private PrintStream out;
private PrintStream file;
public DualStream(File file, PrintStream out) throws FileNotFoundException
{
super(file);//I'm being SUPER lazy/hacky here
this.out = out;
this.file = new PrintStream(file);
}
//... through all the methods I want to use...
public void println(String x) {
out.println(x);
file.println(x);
}
}
public static void main(String ... args) throws FileNotFoundException
{
DualStream out = new DualStream(new File("output.txt"), System.out);
System.setOut(out);
System.out.println("This is a test");
}
现在这是一个糟糕的代码,首先我违反了我的构造函数合同,但它确实有效。我一点也不建议你这么做,我只是想证明如果你真的需要它,它“可以做到”。正确的方法是使用许多记录器中的一个,或者坦率地说,将命令行上的输出重定向到您想要的地方
在这种情况下,您需要使用正在运行的操作系统或服务器:
()
这正是您想要的,但允许用户根据需要登录。如果您不想使用日志系统(Log4J、日志包等)登录,那么我会让您的用户自己决定,只使用err/out而不是过度思考java-jar myjar.jar>log.txt
您应该在任何控制台输出之前调用setOut!,但是现在它没有打印到控制台了:/有什么想法吗?@Razor88您的方法可以打印到控制台或文件。对于打印到两者,您可以执行日志记录(例如log4j)、打印到两者的外部库(apachecommons IO)或构建如上所示的方法来打印到两个(或更多)流。