在练习中,我必须为InputStream创建一个迭代器。 的目标是,用户可以这样做:Iterator for InputStream
for(byte b : new InputStreamToIterable(myInputStream)){
//do stuff with byte
}
我完成了创建它和它的作品很好,但迭代器method
是不是很优雅(很多try/catch
)。
@Override
public Iterator<Byte> iterator() {
// TODO Auto-generated method stub
try {
return new Iterator<Byte>() {
int data = is.read();
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return data != -1;
}
@Override
public Byte next() {
// TODO Auto-generated method stub
if(!hasNext()){
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
int a = data;
try {
data = is.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (byte)a;
}
@Override
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException();
}
};
} catch (IOException e) {
// TODO Auto-generated catch block
throw new UnsupportedOperationException();
}
}
有没有办法让它更好?
讨论的代码,'NoSuchElementException'应按抛出http://docs.oracle.com/javase/6/ docs/api/java/util/Iterator.html – fjf2002 2013-05-01 14:59:20
如果我关闭了流,抛出这个异常并不是强制的,对吧? – user2336315 2013-05-01 15:05:32
只有当你试图访问一个不存在的元素时,才会抛出它,所以基本上如果在'is.close()'后面再次调用next()。 – 2013-05-01 15:09:02