在練習中,我必須爲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