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

Rob*_*iam 2 java

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

我认为围绕它创建一个类可能是有用的,它实现了Iterable<MyObject>它可以使用它

IObjectReader objectReader = new MyObjectReader(someBufferedReaderThatExists);

for (IObjectToProcess obj : objectReader) {
    processTheObject(obj);
}
Run Code Online (Sandbox Code Playgroud)

因为这可以更容易地注入IObjectReader可能创建返回不同类型IObjectToProcess对象的不同对象.

然而,棘手的一点是实现Iterable.hasNext()- 如何在没有实际调用的情况下BufferedReader.readLine()返回null

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

Ted*_*opp 10

不要尝试围绕BufferedReaderapi 工作; 与它合作.在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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)