我有一个LevelDBIterator,我必须在我自己的Java类中包装,它也实现了Iterator并在其中使用了LevelDBIterator。我有2个问题:
1. LevelDB执行文件读取,因此从文件系统读取的方法可以抛出IOException,如何在我的fnAfterEnter
方法中抛出它?原因我问这是因为实施next()
不会让我抛出任何异常
2.另外,如何关闭底层的LevelDBIterator以及何时?
Iterator
答案 0 :(得分:0)
如果要实现需要在迭代结束时关闭资源的Iterator
,则应将其封装在实现Iterable
和AutoCloseable
的对象中。
E.g。如果你通常会这样做:
for (MyObj obj : xxx.getSomeResource()) {
// code here
}
然后更改代码,以便您执行此操作:
try (MyResource res = xxx.getSomeResource()) {
for (MyObj obj : res) {
// code here
}
}
MyResource
的位置如下:
class MyResource implements AutoCloseable, Iterable<MyObj> {
private final LevelDBIterator levelDBIterator;
public MyResource(LevelDBIterator levelDBIterator) {
this.levelDBIterator = levelDBIterator;
}
@Override
public Iterator<MyObj> iterator() {
return /*code here*/;
}
@Override
public void close() throws Exception {
this.levelDBIterator.close();
}
}
答案 1 :(得分:0)
问:如何在我的next()方法中抛出它?
答:您可以捕获异常,然后抛出未经检查的RuntimeException。
问:如何关闭底层的LevelDBIterator以及什么时候?
答:除了实现Iterator之外,还要实现AutoCloseable,并记录您的迭代器必须在使用后关闭。 然后,迭代器的用户可以显式关闭它,或使用try-with-resources。