Java 是否可能知道BufferedReader.readLine()是否会提前返回null?

Java 是否可能知道BufferedReader.readLine()是否会提前返回null?,java,Java,我有一些代码从BufferedReader读取行,并从它读取的数据创建一个对象,然后将其发送以进行处理。这将一直持续到BufferedReader.readLine()返回null(即到达文件末尾或套接字关闭等) 我认为围绕它创建一个类可能很有用,该类实现了Iterable,因此可以使用 IObjectReader objectReader = new MyObjectReader(someBufferedReaderThatExists); for (IObjectToProcess obj

我有一些代码从BufferedReader读取行,并从它读取的数据创建一个对象,然后将其发送以进行处理。这将一直持续到BufferedReader.readLine()返回null(即到达文件末尾或套接字关闭等)

我认为围绕它创建一个类可能很有用,该类实现了
Iterable
,因此可以使用

IObjectReader objectReader = new MyObjectReader(someBufferedReaderThatExists);

for (IObjectToProcess obj : objectReader) {
    processTheObject(obj);
}
因为这样可以更容易地注入不同的
IObjectReader
对象,这些对象可能会创建不同类型的
IObjectToProcess
对象

然而,实现
Iterable.hasNext()
——如何判断
BufferedReader.readLine()
是否会返回
null
,而不实际调用它


(注意:
BufferedReader.ready()
不是答案:它只是告诉我读取是否会阻塞,而不是返回
null

不要尝试使用
BufferedReader
api;用它工作。在
hasNext()
中,让您的读者继续阅读下一行。如果成功,缓存该行并返回
true
。当您实际需要下一行时,请使用缓存行(并清除缓存),而不是调用
readLine()

public class MyObjectReader implements Iterable<String> {
    private BufferedReader rdr;

    public MyObjectReader(BufferedReader rdr) {
        this.rdr = rdr;
    }

    @Override
    Iterator<String> iterator() {
        return new BufferedReaderIterator();
    }
    . . .

    private class BufferedReaderIterator implements Iterator<String> {
        String cachedLine;

        @Override
        public String next() {
            String result = cachedLine == null ? rdr.readLine() : cachedLine;
            cachedLine = null;
            if (result == null) {
                throw new NoSuchElementException();
            }
            return result;
        }

        @Override
        public boolean hasNext() {
            if (cachedLine == null) {
                cachedLine = rdr.readLine();
            }
            return cachedLine != null;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
}
公共类MyObjectReader实现了Iterable{
专用缓冲读取器rdr;
公共MyObjectReader(BufferedReader rdr){
this.rdr=rdr;
}
@凌驾
迭代器迭代器(){
返回新的BufferedReaderInterator();
}
. . .
私有类BufferedReaderIterator实现迭代器{
字符串缓存线;
@凌驾
公共字符串next(){
字符串结果=cachedLine==null?rdr.readLine():cachedLine;
cachedLine=null;
如果(结果==null){
抛出新的NoTouchElementException();
}
返回结果;
}
@凌驾
公共布尔hasNext(){
if(cachedLine==null){
cachedLine=rdr.readLine();
}
返回cachedLine!=null;
}
@凌驾
公共空间删除(){
抛出新的UnsupportedOperationException();
}
}
}

我认为没有一种方法可以实现hasNext,而不首先尝试阅读下一篇文章。当我想到“我想知道是否有更好的方法来做这件事?”并决定把这个问题贴在上面时,我接受这个想法肯定是错误的。