写入控制台和文本文件

时间:2013-04-26 13:21:06

标签: java file-io console fileoutputstream printstream

我从互联网上找到了下面的代码,但它没有将打印的控制台写入omt.txt,它只在第二个catch块之后写入System.out.println语句。如果你运行代码一次我会理解我的意思。我想要的是将控制台上的内容写入“omt.txt”文件中......

经过一些回答,我发现我的问题不明确,对不起。 我想将控制台输出保存到omt.txt文本文件中。如果在控制台上打印“Hello 123”,它也应该在omt.txt文件中。换句话说,打印控制台上的任何内容都应该同时写在om.txt文件中,或者可以在控制台执行后但是应该是1对1相同!

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Wrt_file {

    public static void main(String[] args) {
        System.out.println("THIS is what I see on the console. but not on TEXT file"); 

          File f = new File("omt.txt");
          if(!f.exists())
          {
            try {
                       f.createNewFile();
                } catch (Exception e) {
                    e.printStackTrace();
                }
          }

        try {
                FileOutputStream fos = new FileOutputStream(f);
                PrintStream ps = new PrintStream(fos);
                System.setOut(ps);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("THIS is what I see on the text file, but not on CONSOLE");      

        for (int i=0; i<10; i++){

            System.out.println("Testing");  
        }

    }

}

4 个答案:

答案 0 :(得分:21)

在得知OP想要复制流

后更新了答案

由于您要在两个流中编写数据,请尝试使用TeeOutputStream中的Apache Commons。在第二次尝试更改您的代码

try {
    FileOutputStream fos = new FileOutputStream(f);
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        try {
            fos.flush();
        }
        catch (Throwable t) {
            // Ignore
        }
    }, "Shutdown hook Thread flushing " + f));
    //we will want to print in standard "System.out" and in "file"
    TeeOutputStream myOut=new TeeOutputStream(System.out, fos);
    PrintStream ps = new PrintStream(myOut, true); //true - auto-flush after println
    System.setOut(ps);
} catch (Exception e) {
    e.printStackTrace();
}

现在System.out的结果也会放在您的文件中。

答案 1 :(得分:1)

System.java中,这是out属性的声明:

public final static PrintStream out

你会发现它一次只能是一个PrintSteam对象。所以它是控制台或文件,但不是两者。

在这一行,你已经有效地重新引导了目的地:

System.setOut(ps);

所以你的输出停止在控制台上显示。

答案 2 :(得分:1)

原因是:

The java.lang.System.setOut()方法重新分配“标准”输出流。

所以当你使用System.out.println时,它只会在文本文件中打印

因此,如果要在文本文件和控制台上打印,请尝试以下方法:

    FileOutputStream fos = new FileOutputStream(f);
    PrintStream ps = new PrintStream(fos);
    ps.println("THIS is what I see on the text file, but not on CONSOLE");
    System.out.println("THIS is what I see on the text file, but not on CONSOLE");

        for (int i = 0; i < 4; i++) {

            ps.println("Testing");
            System.out.println("Testing");
        } 

答案 3 :(得分:1)

我对这个问题的解决方案是简单地定义您自己的 PrintStream 来覆盖您正在使用的方法:

import java.io.FileNotFoundException;
import java.io.PrintStream;

public class DualStream extends PrintStream {
    public PrintStream consoleOutput = null;
    public PrintStream fileOutput = null;

    public DualStream(final PrintStream consoleOutput, final PrintStream fileOutput) throws FileNotFoundException {
        super(fileOutput, true);
        this.consoleOutput = consoleOutput;
        this.fileOutput = fileOutput;
    }

    @Override
    public void println() {
        consoleOutput.println();
        super.println();
    }

    @Override
    public void println(final Object output) {
       consoleOutput.println(output);
        super.println(output);
    }

    @Override
    public void println(final String output) {
        consoleOutput.println(output);
        super.println(output);
    }

    @Override
    public PrintStream printf(final String output, final Object... variables) {
        consoleOutput.printf(output, variables);
        super.printf(output, variables);
        return this;
    }
}

我们没有覆盖的每个方法都将默认仅将输出写入文件。 (要默认为控制台,您可以在构造函数中切换 1 行或在构造函数调用中切换两个打印流位置)

现在只需定义 2 个打印流,其中一个将写入您的文件,让我们将其设为缓冲输出流以确保良好的性能:

public static void outputFile(final String file) {
    PrintStream CombinedOutput = null;
    try {
        CombinedOutput = new DualStream(System.out, new PrintStream(new BufferedOutputStream(new FileOutputStream(file))));
    } catch (final FileNotFoundException e) {
        e.printStackTrace();
    }
    System.setOut(CombinedOutput);
}