0

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

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

4

2 回答 2

1

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

于 2013-03-09T02:51:33.927 回答
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;
    }
}
}

干得好 :-)

于 2013-03-12T17:58:29.180 回答