针对System.out 以及 System.err 进行拦截 比如将打印信息 输出到指定的文件:
不如 拦截 Jdk logger 的 ConsoleHandler 或者 logj4j的 ConsoleAppender 时
一下是 demo 代码:
============================================================
package com.bes.graphics;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.RandomAccessFile;
public class SystemErrInterceptor {
private SystemErrInterceptor(){
System.setErr(new SelfPrintStream());
System.setOut(new SelfPrintStream());
}
private static final SystemErrInterceptor instance = new SystemErrInterceptor();
public static final SystemErrInterceptor getInstance(){
return instance;
}
private static class SelfPrintStream extends PrintStream{
public SelfPrintStream(){
super(new SelfOutputStream());
}
@Override
public void print(boolean b) {
log(String.valueOf(b));
}
@Override
public void print(char c) {
log(String.valueOf(c));
}
@Override
public void print(char[] s) {
log(new String(s));
}
@Override
public void print(double d) {
log(String.valueOf(d));
}
@Override
public void print(float f) {
log(String.valueOf(f));
}
@Override
public void print(int i) {
log(String.valueOf(i));
}
@Override
public void print(long l) {
log(String.valueOf(l));
}
@Override
public void print(Object obj) {
log(String.valueOf(obj));
}
@Override
public void print(String s) {
log(s);
}
@Override
public void println() {
log("\n");
}
@Override
public void println(boolean x) {
log(x + "\n");
}
@Override
public void println(char x) {
log(x + "\n");
}
@Override
public void println(char[] x) {
log(new String(x) + "\n");
}
@Override
public void println(double x) {
log(x + "\n");
}
@Override
public void println(float x) {
log(x + "\n");
}
@Override
public void println(int x) {
log(x + "\n");
}
@Override
public void println(long x) {
log(x + "\n");
}
@Override
public void println(Object x) {
log(x + "\n");
}
@Override
public void println(String x) {
log(x + "\n");
}
}
private static class SelfOutputStream extends ByteArrayOutputStream{
@Override
public synchronized void write(byte[] b, int off, int len) {
log(String.valueOf(b));
}
@Override
public synchronized void write(int b) {
log(String.valueOf(b));
}
@Override
public void write(byte[] b) throws IOException {
log(String.valueOf(b));
}
}
/**
* @param obj
*/
private static void log(Object obj){
try{
File f = new File("c:/a.log");
if(!f.exists()){
f.createNewFile();
}
RandomAccessFile raf = new RandomAccessFile(f, "rw");
raf.seek(raf.length());
String msg = obj + "\r\n";
raf.write(msg.getBytes("utf-8"));
}catch(Exception ex){
ex.printStackTrace();
}
}
}
拦截 System.out 以及 System.err
原创
©著作权归作者所有:来自51CTO博客作者莫建坡的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
System.out::println解读
System.out::println解读个人总结:首先调用System里的Out类掉用plintln方法,会有一个参数传进去,就是foreach的其中一个,
java lambda System List 静态方法 -
Mock System.in和检查System.out
做在单元测试的时候,会遇到测试数据依赖于用户输入的情况,类似于代码Scanner scanner = new
重置 性能测试 单元测试 java 测试数据 -
标准输入输出流(System.in,System.out)
1.标准输入流(System.in)首先这个标准输入流的默认输入设备是键盘,数据源是键盘,下 in =
java intellij-idea System 标准输入流 -
System.out::println; 是什么鬼???
1.第一次见到该表达式的感受 第一此次见到该表达式的时候,我还不知道什么是方法引用,当时真是一脸蒙圈,然后问了好多同事,给我的解释也是五花八门,但我还是感觉莫名其妙,有段时间想着就当一个特例记住就好了,不要再去深究了!!!但是我这个人,在这种时候就是很难说服自己,于是有了上篇文章,再回过头来看这个问题,其实就变得非常简单了。2.揭开System.out::print...
Lambda表达式 lambda表达式 System.out::println PrintStream JAVA