正好刚写了一个类似的,拿去参考一下吧
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。你这里应该有性能需求,可以用一个数组实现的循环链表来实现类似功能