2013-07-02 131 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上發佈這個問題。 –

相關問題