On 1/30/2012 3:03 PM, frame wrote:
We have an existing Java program, which prints out a lot of message
using System.out.println() method to the console. There are about 500
those calls in the code. We hope to add one more feature: besides
print out to the console as it is doing now, we also want to store
those messages in a text file. So the message will be in two places:
one place -- the console -- is shown the message progressively as the
program is running; another place -- a text file -- is created at the
end of the program.
Since there are about 500 calls in the code, we don't want to add a
duplicated printing method at every printing place. I am thinking to
let the program run as usal, printing out all the messages to the
console, then before the program ends, having a method reading in
every line on the console, which was printed out previously. I just
don't know how to achieve that.
If you can live with the file being written while the
program runs then something like:
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
public class TeeOutputStream extends OutputStream {
private OutputStream os1;
private OutputStream os2;
public TeeOutputStream(OutputStream os1, OutputStream os2) {
this.os1 = os1;
this.os2 = os2;
}
public void write(byte[] b) throws IOException {
os1.write(b);
os2.write(b);
}
public void write(byte[] b, int off, int len) throws IOException {
os1.write(b, off, len);
os2.write(b, off, len);
}
public void write(int b) throws IOException {
os1.write(b);
os2.write(b);
}
public void flush() throws IOException {
os1.flush();
os2.flush();
}
public void close() throws IOException {
os1.close();
os2.close();
}
public static void test2() {
System.out.println("This is test2");
}
public static void test1() {
System.out.println("This is test1");
}
public static void main(String[] args) throws IOException {
System.out.println("normal");
PrintStream sav = System.out;
System.setOut(new PrintStream(new TeeOutputStream(System.out, new
PrintStream("C:\\work\\tst.out"))));
test1();
test2();
System.setOut(sav);
System.out.println("normal");
}
}
AspectJ magic.