BufferedReader br = new BufferedReader(new FileReader("shark-data.txt"));
String fileRead = br.readLine();
PrintStream out = new PrintStream(new FileOutputStream("results.txt"));
System.setOut(out);
代码有效,它会创建一个新的文本文件,并将我从控制台输出的内容放入文本文件中。问题是我的控制台上没有任何内容。我该如何解决这个问题?
答案 0 :(得分:2)
您可以使用Apache commons-io中的TeeOutputStream
将流分成两部分:https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/output/TeeOutputStream.html
OutputStream fos = new FileOutputStream("results.txt");
OutputStream consoleOut = System.out;
PrintStream newOut = new PrintStream(new TeeOutputStream(consoleOut, fos));
System.setOut(newOut);
这将创建PrintStream
写入原始System.out
(即控制台)和文件。
在Maven中,这里是你可以用来为你的项目添加commons-io的依赖片段:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
答案 1 :(得分:1)
首先,您必须创建一个从OutputStream接口继承的类来实现适配器模式(我还不确定是否是适配器)
然后您可以将此类用作下面的
主要强>
PrintStream finalStream;
TreeOutputStream tos;
PrintStream out;
out = new PrintStream("logs.txt");
tos = new TreeOutputStream();
tos.add(out);
tos.add(System.out);
finalStream = new PrintStream(tos);
System.setOut(finalStream);
<强> TreeOutputStream 强>
public class TreeOutputStream extends OutputStream{
private final List<OutputStream> streams;
public void add(OutputStream os){
streams.add(os);
}
public void remove(OutputStream os){
streams.remove(os);
}
public TreeOutputStream() {
streams = new ArrayList<>();
}
@Override
public void write(int i) throws IOException {
streams.stream().forEach(strm->{
try {
strm.write(i);
} catch (IOException ex) {
Logger.getLogger(TreeOutputStream.class.getName()).log(Level.SEVERE, null, ex);
}
});
}
}
您的输出流将在所有调用其写入方法的流上循环
答案 2 :(得分:1)
在执行System.setOut之前 保存标准控制台,
PrintStream standard = System.out;
要再次打印到控制台,你应该使用下面的方法切换到标准控制台,而不是你可以打开控制台。
System.setOut(标准); 的System.out.println( “你好!”);