Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java InputStream的迭代器_Java_Iterator_Inputstream - Fatal编程技术网

Java 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(){

在练习中,我必须为InputStream创建一个迭代器。 目标是用户可以做到:

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();
}
}
有没有办法让它变得更好?

你可以

  • 在方法
    next()
    中:将两个try-catch块统一为一个块
  • 执行赋值
    int data=is.read()
    
捕获IOException时,不要简单地调用
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;
}