Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:打印到控制台和文件_Java_File - Fatal编程技术网

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)或构建如上所示的方法来打印到两个(或更多)流。