2010-03-25 2 views

답변

12

당신은 "부울 준비()"방법을 시도 할 수 있습니다. Java 6 API 문서에서 : "버퍼가 비어 있지 않거나 기본 문자 스트림이 준비되어 있으면 버퍼링 된 문자 스트림이 준비되었습니다."

BufferedReader r = new BufferedReader(reader); 
if(r.ready()) 
{ 
    r.read(); 
} 
9

다음 코드는 스트림의 첫 번째 바이트를 살펴 봅니다. 당신을 위해 엿보기처럼 행동해야합니다.

BufferedReader bReader = new BufferedReader(inputStream); 
bReader.mark(1); 
int byte1 = bReader.read(); 
bReader.reset(); 
+0

그러나 마크는 값을 반환하지 않으므로 정말로 확인할 수 없습니까? –

+0

그런데 엿보기가 싫어서 값을 돌려주고 싶습니까? –

+0

예 int peek()을 원합니다. 스트림에 무언가가 있다면 반환 값을 확인하여 스트림의 상태가 변경되지 않도록 해답을 얻습니다. –

2
BufferedReader br = new BufferedReader(reader); 
br.mark(1); 
int firstByte = br.read(); 
br.reset(); 
30

PushbackReader을 사용할 수 있습니다. 이를 사용하여 문자를 읽은 다음 읽을 수 있습니다. 이것은 본질적으로 당신이 그것을 뒤로 밀 수 있습니다.

PushbackReader pr = new PushbackReader(reader); 
char c = (char)pr.read(); 
// do something to look at c 
pr.unread((int)c); //pushes the character back into the buffer 
+2

좋은 답변입니다! 이것은 Java "peek"입니다. – Pindatjuh

+1

참고 사항 : http://stackoverflow.com/a/9198381/59087 –

4

정상적인 관용구 BufferedReader#readLine()null을 반환하지 않는 경우 루프에서 확인하는 것입니다. 스트림의 끝에 도달하면 (예 : 파일 끝, 소켓 닫기 등) null을 반환합니다.

예.

BufferedReader reader = new BufferedReader(someReaderSource); 
String line = null; 
while ((line = reader.readLine()) != null) { 
    // ... 
} 

당신이 다음 BufferedReader#ready() 대신 사용 (A BufferedReader가 선택되어있는 주요 이유 그런데 인) 라인에서 읽을 수 없다 경우

BufferedReader reader = new BufferedReader(someReaderSource); 
while (reader.ready()) { 
    int data = reader.read(); 
    // ... 
} 
1

당신은 PushBackReader를 사용할 수는 문자를 읽은 다음 "뒤로 밀기". 그렇게하면 전체적인 상태에 영향을주지 않고 무언가가 있다는 것을 확실히 알 수 있습니다.

1

준비() 메소드를 사용하는 pgmura의 답변은 간단하며 작동합니다. 그러나 그 이유는 Sun의 방법을 구현했기 때문입니다. 이는 실제로 문서에 동의하지 않습니다. 이 행동이 중요하다면 나는 그것에 의지하지 않을 것입니다. 여기를 참조하십시오. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 차라리 PushbackReader 옵션을 사용하고 싶습니다.

0

내 솔루션은 .. BufferedReader를 확장하고 buf로 큐를 사용하면 큐에서 peek 메서드를 사용할 수 있습니다.

public class PeekBufferedReader extends BufferedReader{ 

    private Queue<String>  buf; 
    private int     bufSize; 

    public PeekBufferedReader(Reader reader, int bufSize) throws IOException { 
     super(reader); 
     this.bufSize = bufSize; 
     buf = Queues.newArrayBlockingQueue(bufSize); 
    } 

    /** 
    * readAheadLimit is set to 1048576. Line which has length over readAheadLimit 
    * will cause IOException. 
    * @throws IOException 
    **/ 
    //public String peekLine() throws IOException { 
    // super.mark(1048576); 
    // String peekedLine = super.readLine(); 
    // super.reset(); 
    // return peekedLine; 
    //} 

    /** 
    * This method can be implemented by mark and reset methods. But performance of 
    * this implementation is better (about 2times) than using mark and reset 
    **/ 
    public String peekLine() throws IOException { 
     if (buf.isEmpty()) { 
      while (buf.size() < bufSize) { 
       String readLine = super.readLine(); 
       if (readLine == null) { 
        break; 
       } else { 
        buf.add(readLine); 
       } 
      } 
     } else { 
      return buf.peek(); 
     } 
     if (buf.isEmpty()) { 
      return null; 
     } else { 
      return buf.peek(); 
     } 
    } 

    public String readLine() throws IOException { 
     if (buf.isEmpty()) { 
      while (buf.size() < bufSize) { 
       String readLine = super.readLine(); 
       if (readLine == null) { 
        break; 
       } else { 
        buf.add(readLine); 
       } 
      } 
     } else { 
      return buf.poll(); 
     } 
     if (buf.isEmpty()) { 
      return null; 
     } else { 
      return buf.poll(); 
     } 
    } 
    public boolean isEmpty() throws IOException { 
     if (buf.isEmpty()) { 
      while (buf.size() < bufSize) { 
       String readLine = super.readLine(); 
       if (readLine == null) { 
        break; 
       } else { 
        buf.add(readLine); 
       } 
      } 
     } else { 
      return false; 
     } 
     if (buf.isEmpty()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 
관련 문제