私が欲しいのは、次のようなものになってしまうことです。
public class InterleavedBufferedReader extends BufferedReader {
...
}
そしてそれを次のように使用します:
Reader[3] readers = ...; // three readers
InterleavedBufferedReader ibr = new InterleavedBufferedReader(readers);
ibr.readLine(); // this returns the first line of Reader 1
ibr.readLine(); // this returns the first line of Reader 2
ibr.readLine(); // this returns the first line of Reader 3
ibr.readLine(); // this returns the second line of Reader 1
ibr.readLine(); // this returns the second line of Reader 2
ibr.readLine(); // hey, Reader 3 had no more lines, return the third line of Reader 1
私が試したこと(ダメ、私は知っている、それが私がここにいる理由です):
public class InterleavedBufferedReader extends BufferedReader {
static private int current = 0;
private BufferedReader[] buffers;
public InterleavedBufferedReader(BufferedReader[] in) {
super(new StringReader("dummy"));
buffers = in;
}
public InterleavedBufferedReader(Reader[] in) {
super(new StringReader("dummy"));
buffers = new BufferedReader[in.length];
for (int i=0 ; i < in.length ; i++)
buffers[i] = new BufferedReader(in[i]);
}
@Override
public String readLine() throws IOException {
int start = current;
String line = null;
while ((line = buffers[current].readLine()) == null) {
current = (current+1) % buffers.length;
if (current == start)
return null;
}
current = (current+1) % buffers.length;
return line;
}
@Override
public void close() throws IOException {
for (int i=0; i < buffers.length; i++)
buffers[i].close();
}
}
コメント:
- インターリーブ
readLine()
は実際に機能します! - おそらく私は拡張するべきではありません
BufferedReader
。私はそれに管理するためのダミーのリーダーを与えることを余儀なくされます、さもなければそれはコンパイルさえしません。その間、readLine()
メソッドをオーバーライドして、子リーダーで呼び出すようにします。read()
しかし、他のメソッドは、実際には私のダミーリーダーを参照するため、実装は少なくとも不完全です。
これをよりクリーンな方法で行うことはできますか?