写入控制台和文本文件

我从互联网上找到了下面的代码,但它不会将打印的控制台写入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"); } } } 

在得知OP想要复制流之后更新了答案

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

 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结果也将放在您的文件中。

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

 public final static PrintStream out 

您将看到它一次只能是一个PrintSteam对象。 所以它是控制台或文件,但不是两者。

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

 System.setOut(ps); 

因此,您的输出将停止在控制台上显示。

原因是 :

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