我从互联网上找到了下面的代码,但它没有将打印的控制台写入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");
}
}
}
答案 0 :(得分:21)
由于您要在两个流中编写数据,请尝试使用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);
}