Java Reader pre&发布数据

时间:2013-03-09 02:40:36

标签: java decorator bufferedreader streamreader

我是否可以使用Reader类(JDK或库)来装饰另一个Reader,以便新读者返回"PREFIX" + everythong of innerReader + "POSTFIX"

我想在将Reader返回给调用者之前用页眉和页脚装饰文件内容。

2 个答案:

答案 0 :(得分:1)

不在标准库中,但请查看http://ostermiller.org/utils/Concat.html 看起来很有希望,但我自己没有用过它。

答案 1 :(得分:0)

我代表GreyBeardedGeek的帖子建立了这个,也许有人可以使用它:

/**
 * Utility <code>Reader</code> implementation which joins one or more other <code>Reader</code> to appear as one.
 */
public class CompositeReader extends Reader {

/** Logger. */
private final static Logger log = LoggerFactory.getLogger(CompositeReader.class);

/** List of readers (in order). */
private final Reader[] readers;
/** Current index. */
private int index;

/**
 * @param readers ordered list of <code>Reader</code> to read from.
 */
public CompositeReader(final Reader... readers) {
    checkArgument(readers.length > 0, "Argument readers must not be empty.");

    this.readers = readers;
    index = 0;
}

@Override
public int read(final char[] cbuf, final int off, final int len) throws IOException {
    int read = 0;
    while (read < len && index != readers.length) {
        final Reader reader = readers[index];
        final int readFromReader = reader.read(cbuf, off + read, len - read);

        if (readFromReader == -1) {
            ++index;
        } else {
            read += readFromReader;
        }
    }

    if (read == 0) {
        return -1;
    }

    return read;
}

@Override
public void close() throws IOException {
    IOException firstException = null;

    for (final Reader reader : readers) {
        try {
            reader.close();
        } catch (final IOException ex) {
            if (firstException != null) {
                log.warn("Multiple readers could not be closed, only first exception will be thrown.");
                firstException = ex;
            }
        }
    }

    if (firstException != null) {
        throw firstException;
    }
}
}

在这里: - )