有多种方法可以在多线程时将整个控制台输出保存到文件中吗?我正在使用5个线程。我有这个想法,我可以在运行方法中放置一个打印流。
示例:
public void run() {
try{
PrintStream out = new PrintStream(file);
stopExecute stop = new stopExecute();
Thread t = new Thread(stop);
Scanner in = new Scanner(System.in);
t.start();
while (!in.hasNextLine())
{
classThatUsingMultipleThrads();
System.out.println("Finished");
anotherClassThatUsingThreads();
System.out.println("Finished");
}
System.out.prinln("User stopped the execution");
stop.keepRunning = false;
System.setOut(out);
}
catch(IOException e){System.out.println(e);}
问题在于它只保存输出"用户停止执行"并且whileloop中的所有内容都没有保存。或者来自其他类的输出流。
我试图把
System.setOut(out);
在while循环中,但没有帮助。
编辑:拼写纠正
答案 0 :(得分:0)
try {
System.setOut(new PrintStream(new File("output-file.txt")));
}
catch (Exception e) {
e.printStackTrace();
}
答案 1 :(得分:0)
您应该考虑使用Log4J等日志库。但是你也可以使用像TeeOutputStream
这样的东西。这种类型的输出流在调用时写入其他2个流。一些库有很好的实现,但你也可以自己编写一个。我快速地把这个鞭打了。
您可以使用main
方法为整个程序设置输出流,以使用此TeePrintStream
,然后对System.out.*
的所有调用都会将数据写入通常的System.out
和你的FileOutputStream
。
Theres也是TeePrintStream的实现http://www.java2s.com/Code/Java/File-Input-Output/TeePrintStreamteesallPrintStreamoperationsintoafileratherliketheUNIXtee1command.htm
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
public class SO34042494 {
public static void main(String[] args) throws FileNotFoundException {
System.setOut(new TeePrintStream(System.out, new FileOutputStream(new File("x:\\output.txt"))));
System.out.println("Check check");
System.out.println("1");
System.out.println(2);
System.out.println(3L);
}
public static class TeePrintStream extends PrintStream {
private final OutputStream tee;
public TeePrintStream(PrintStream original, OutputStream tee) {
super(original);
this.tee = tee;
}
@Override
public void write(byte[] b) throws IOException {
super.write(b);
tee.write(b);
}
@Override
public void write(byte[] buf, int off, int len) {
super.write(buf, off, len);
try {
tee.write(buf, off, len);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void write(int b) {
super.write(b);
try {
tee.write(b);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public synchronized void close() {
try {
tee.close();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
super.close();
}
}
}
}
我在这里的TeePrintStream是我刚刚聚集在一起的,如果您要在生产项目中使用它,请将其打磨并彻底测试
答案 2 :(得分:0)
Okej我想我解决了它。在我的主要内容我就是这样:
public static void main(String[] args) {
Prinstream out = new Prinststream(file);
/*
Do some things like start threads, call objects etc..
.
.
.
.
*/
System.setOut(out);
我认为当所有线程都启动并执行它们时(我确实为每个线程分配了一个对象),printstream将捕获其他类中发生的每个控制台输出。 在我编辑stopExecute类之前,这没有用。
public class stopExecute implements Runnable {
Scanner scan = new Scanner(System.in);
private Object[] obj;
public stopExecute(Object[] obj)
{
this.obj = obj;
}
public void run() {
while(true){
stop();
}
}
public void stop() {
if(scan.hasNextLine()){
System.out.println("Stopped");
System.exit(0);
}
}
}
谢谢你的帮助。我会调查你的建议并试一试。在此解决方案中,我无法使用Log4J。但我肯定会检查出来。