我有一些代码从BufferedReader读取行,并从它读取的数据创建一个对象,然后将其发送出去进行处理.这一直持续到BufferedReader.readLine()返回null(即到达文件结尾或关闭套接字等)
我认为围绕它创建一个类可能是有用的,它实现了Iterable<MyObject>它可以使用它
IObjectReader objectReader = new MyObjectReader(someBufferedReaderThatExists);
for (IObjectToProcess obj : objectReader) {
processTheObject(obj);
}
Run Code Online (Sandbox Code Playgroud)
因为这可以更容易地注入IObjectReader可能创建返回不同类型IObjectToProcess对象的不同对象.
然而,棘手的一点是实现Iterable.hasNext()- 如何在没有实际调用的情况下BufferedReader.readLine()返回null?
(注意:BufferedReader.ready()不是答案:它只是告诉我读取是否会阻止,而不是它会返回null)
Ted*_*opp 10
不要尝试围绕BufferedReaderapi 工作; 与它合作.在hasNext(),让你的读者继续前进并尝试阅读下一行.如果成功,则缓存该行并返回true.使用缓存行(并清除缓存)而不是readLine()在实际需要下一行时调用.
public class MyObjectReader implements Iterable<String> {
private BufferedReader rdr;
public MyObjectReader(BufferedReader rdr) {
this.rdr = rdr;
}
@Override
Iterator<String> iterator() {
return new BufferedReaderIterator();
}
. . .
private class BufferedReaderIterator implements Iterator<String> {
String cachedLine;
@Override
public String next() {
String result = cachedLine == null ? rdr.readLine() : cachedLine;
cachedLine = null;
if (result == null) {
throw new NoSuchElementException();
}
return result;
}
@Override
public boolean hasNext() {
if (cachedLine == null) {
cachedLine = rdr.readLine();
}
return cachedLine != null;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
Run Code Online (Sandbox Code Playgroud)