Java InputStream的迭代器
在练习中,我必须为InputStream创建一个迭代器。 目标是用户可以做到:Java InputStream的迭代器,java,iterator,inputstream,Java,Iterator,Inputstream,在练习中,我必须为InputStream创建一个迭代器。 目标是用户可以做到: for(byte b : new InputStreamToIterable(myInputStream)){ //do stuff with byte } 我完成了它的创建,它工作得很好,但是迭代器方法不是很优雅(很多try/catch) @覆盖 公共迭代器迭代器(){ //TODO自动生成的方法存根 试一试{ 返回新的迭代器(){ int data=is.read(); @凌驾 公共布尔hasNext(){
for(byte b : new InputStreamToIterable(myInputStream)){
//do stuff with byte
}
我完成了它的创建,它工作得很好,但是迭代器方法
不是很优雅(很多try/catch
)
@覆盖
公共迭代器迭代器(){
//TODO自动生成的方法存根
试一试{
返回新的迭代器(){
int data=is.read();
@凌驾
公共布尔hasNext(){
//TODO自动生成的方法存根
返回数据!=-1;
}
@凌驾
公共字节下一个(){
//TODO自动生成的方法存根
如果(!hasNext()){
试一试{
is.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
int a=数据;
试一试{
data=is.read();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回(字节)a;
}
@凌驾
公共空间删除(){
//TODO自动生成的方法存根
抛出新的UnsupportedOperationException();
}
};
}捕获(IOE异常){
//TODO自动生成的捕捉块
抛出新的UnsupportedOperationException();
}
}
有没有办法让它变得更好?你可以
- 在方法
中:将两个try-catch块统一为一个块next()
- 执行赋值
int data=is.read()在构造函数中,使用try-catch块,然后去掉最外层的try-catch块
e.printStackTrace()
并继续执行程序,更好的做法是使此类用户能够通过重新抛出一些RuntimeException(无需声明,因此不会违反Iterable接口)以编程方式处理错误:
通过组合
next()
中的两个try catch
块,您可以稍微清理一下:
编辑根据下面
中的讨论更改了代码!hasNext()
分支,应根据以下条件引发NoSuchElementException
,如果我关闭流,则不必引发此异常,对吗?仅当您尝试访问不存在的元素时才会引发此异常,因此基本上如果在is.close()
之后再次调用next()
。
@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();
}
}
catch(IOException e) {
throw new RuntimeException(e);
}
boolean isClosed = false;
@Override
public Byte next() {
if(isClosed) throw new NoSuchElementException();
int a = data;
try {
if(!hasNext()) {
is.close();
isClosed = true;
} else
data = is.read();
} catch(IOException e) { throw new RuntimeException(e); }
return (byte)a;
}