2013-02-13 2 views
2

자바에 관한 책을 읽었으며 채널에서 ByteBuffer로 읽는 중입니다.누군가 왜 이런 식으로 while 루프를 구성합니까?

 

    try (FileChannel inCh = (FileChannel) Files.newByteChannel(file)) { 
      ByteBuffer lengthBuf = ByteBuffer.allocate(8); 
      int strLength = 0; 

      ByteBuffer[] buffers = { null, ByteBuffer.allocate(8) }; 

      while(true) { 
       if(inCh.read(lengthBuf) == -1) 
        break; 
       lengthBuf.flip(); 

       strLength = (int)lengthBuf.getDouble(); 

       buffers[0] = ByteBuffer.allocate(2*strLength); 

       if(inCh.read(buffers) == -1) { 
        System.err.println("EOF found reading ht eprime string."); 
        break; 
       } 

       System.out.printf("String length: %3s String: %-12s Binary Value: %3d%n", strLength, 
            ((ByteBuffer) (buffers[0].flip())).asCharBuffer().toString(), 
            ((ByteBuffer)buffers[1].flip()).getLong()); 

       lengthBuf.clear(); 
       buffers[1].clear(); 
      } 
      System.out.println("\nEOF reached."); 
     } catch (IOException e) { 

내가 이런 식으로 시도 : 나는 저자가 홀수 while 루프를 구조화 된 방법을 발견

while(inCh.read(lengthBuf) != -1) { 

와 동일한 작동합니다. 저자가 그가했던 것처럼 실용적이거나 코드 명확성의 이유가 있을까요?

+0

개인 취향에 따라 다를 수 있습니다. 변경 사항이 동일한 방식으로 작동 함을 보여줄 수 있다면 원하는 경우 사용하십시오. – Bernard

+0

내가 볼 수있는 것은 아닙니다. –

답변

9

루프의 버전이 의미 상 동일하다는 것은 분명합니다. 그러나 이것이 고려해야 할 유일한 것이 아닙니다.

루프 while 루프 아래쪽에는 루프에서 벗어나는 두 번째 조건이 있습니다. 나는 이것이 저자에게 while (true)을 사용하게 한 동기라고 생각합니다.

while (true)으로 작성하면 while 안에 하나 이상의 중단이 있어야한다는 사실을 독자에게 알립니다. 독자는 휴식 시간에 루프 내부를 조사해야하며 두 가지를 모두 찾을 수 있습니다.

당신의 방법대로, 캐주얼 리더는 코드 상단을 스캔하여 while 조건이 루프를 종료하는 유일한 방법이라고 가정합니다.

고려해야 할 또 다른 포인트는 대칭 또는 균형입니다. 원래 작성자가 작성한 것처럼 루프 종료는 모두 동일한 형식입니다. 즉 루프 내에서 끊어집니다. 귀하의 버전이 비대칭이라고 느낍니다. while 테스트의 한 종료 지점과 다른 성격의 종료 지점이 루프 내부에 있습니다.

+2

코멘트는 그 사람을 죽이지 않았을 것입니다! :) –

2

작성자는 두 개의 종료 점을 가지며, 그 중 하나는 루프를 종료하기 전에 오류를 인쇄합니다. 이 경우 코드를 조금 더 장황하게 만듭니다. 물론 여러 가지 방법으로 작성 될 수 있습니다.

관련 문제