2013-07-02 2 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에 게시하기로 결정했습니다. –

관련 문제