2013-07-02 42 views
2

我有一些代码读取BufferedReader中的行,并从它读取的数据创建一个对象,然后将其发送出去进行处理。这继续下去,直到BufferedReader.readLine()返回null(即到达文件末尾或套接字关闭等)是否有可能知道BufferedReader.readLine()是否会提前返回null?

我认为这可能是有用的创建一个类,它实现Iterable<MyObject>因此它可以被消耗

IObjectReader objectReader = new MyObjectReader(someBufferedReaderThatExists); 

for (IObjectToProcess obj : objectReader) { 
    processTheObject(obj); 
} 

,因为这样会更容易注入可能创造回报不同类型IObjectToProcess对象的不同IObjectReader对象。

然而,棘手的一点是执行Iterable.hasNext() - 我怎么能告诉BufferedReader.readLine()将返回null没有实际调用它?

(注:BufferedReader.ready()不是问题的答案:它只是告诉我,如果读会阻塞,而不是是否会返回null

+0

我不认为有一种方法来实现hasNext,而不先尝试读下一个。我可以肯定是错的,虽然 – Scotch

回答

10

不要试图围绕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(); 
     } 
    } 
} 
+0

接受这个,因为它是我前往的地方,当我想:“我想知道是否有更好的方法来做这件事?并决定在SO上发布这个问题。 –

相关问题