Java:打印到控制台和文件

时间:2014-09-25 01:35:45

标签: java file

我有点问题

我正在运行一个包含许多类的程序,其中一个驱动程序可以运行所有这些类。当我运行驱动程序时,输出在控制台上打印就好了,但我还需要从控制台输出的确切输出才能打印到文件中。

但是,我似乎无法将控制台输出打印到文件中。我在这里试过了这个建议

How to write console output to a txt file

通过这样做

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();
        }


    }
}

但是文件仍然是空白的(也许是因为print语句在其他文件中?)。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

创建一个方法,在输出打印到两个流的任何内容时,您将在整个代码中使用该方法:

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();

答案 1 :(得分:1)

我确定在完成输入之前会回答这个问题...但是,这里发生的是您将(默认)输出流从控制台重定向到文件。如果要打印到两个位置,则需要具有实际记录到两个位置的PrintStream。 (或者你可以去查找一个日志记录解决方案 - 有几个)。但是,为了温和地学习它:

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html

您可以通过实现接口并在每种情况下都记录到文件和控制台来实现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");
    }

现在这是一个非常糟糕的代码,首先我违反了我的构造函数合同才能完成这项工作,但 确实有效 。我根本不建议这样做,我只是想证明它可以做到"可以做到"如果你真的需要它。正确的方法是使用其中一个记录器,或者坦率地说,将命令行上的输出重定向到你想要的位置。

在这种情况下,您需要使用操作系统或您正在运行的服务器: (how to redirect a output of a command to two files) 这完全符合您的要求,但允许用户根据需要进行记录。如果您不想使用日志记录系统(Log4J,Logging package等等)进行日志记录,那么我将其留给您的用户并使用err / out而不是过度使用它。 java -jar myjar.jar > log.txt