正好刚写了一个类似的,拿去参考一下吧
package com.ricemap.utilities.config.cmd;import org.apache.logging.log4j.Logger;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.List;public class LogPrintWriter extends PrintWriter { public LogPrintWriter(Logger logger) {
super(new LogOutputStream(logger));
} private static class LogOutputStream extends OutputStream {
private Logger iLogger; private ByteArrayOutputStream iCache = new ByteArrayOutputStream(); private List<Integer> iEndLineCache = new LinkedList<>(); public LogOutputStream(Logger logger) {
iLogger = logger;
} @Override
public void write(int b) throws IOException {
byte[] sepBytes = System.lineSeparator().getBytes();
if (iEndLineCache.size() == sepBytes.length)
iEndLineCache.remove(0); iEndLineCache.add(b);
iCache.write(b); boolean isEndLine = true;
for (int i = 0; i < sepBytes.length; i++) {
if (iEndLineCache.get(i) != sepBytes[i]) {
isEndLine = false;
break;
}
} if (isEndLine) {
iLogger.info(iCache.toString());
iCache.reset();
}
}
}
}这里的Logger要在找到换行符的时候记录一次cache里的内容,跟你要做的基本类似。这里System.lineSeparator().getBytes()是不确定长度的。我因为这里不需要考虑性能,所以用了一个LinkedList来做那个EndLineCache。你这里应该有性能需求,可以用一个数组实现的循环链表来实现类似功能
package com.ricemap.utilities.config.cmd;import org.apache.logging.log4j.Logger;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.List;public class LogPrintWriter extends PrintWriter { public LogPrintWriter(Logger logger) {
super(new LogOutputStream(logger));
} private static class LogOutputStream extends OutputStream {
private Logger iLogger; private ByteArrayOutputStream iCache = new ByteArrayOutputStream(); private List<Integer> iEndLineCache = new LinkedList<>(); public LogOutputStream(Logger logger) {
iLogger = logger;
} @Override
public void write(int b) throws IOException {
byte[] sepBytes = System.lineSeparator().getBytes();
if (iEndLineCache.size() == sepBytes.length)
iEndLineCache.remove(0); iEndLineCache.add(b);
iCache.write(b); boolean isEndLine = true;
for (int i = 0; i < sepBytes.length; i++) {
if (iEndLineCache.get(i) != sepBytes[i]) {
isEndLine = false;
break;
}
} if (isEndLine) {
iLogger.info(iCache.toString());
iCache.reset();
}
}
}
}这里的Logger要在找到换行符的时候记录一次cache里的内容,跟你要做的基本类似。这里System.lineSeparator().getBytes()是不确定长度的。我因为这里不需要考虑性能,所以用了一个LinkedList来做那个EndLineCache。你这里应该有性能需求,可以用一个数组实现的循环链表来实现类似功能
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货