2013-02-13 96 views
2

我正在阅读一本关于Java的书,并且我们正在从一个频道读入ByteBuffer。我发现作者是构建while循环奇道:为什么有人会像这样构造一个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(inCh.read(lengthBuf) != -1) { 

,它的工作原理相同。作者是否会像他那样写出实用或代码清晰的原因?

+0

这可能只是他们的个人喜好。如果您可以证明您的更改以同样的方式运行,那么如果您愿意,也可以使用该更改。 – Bernard 2013-02-13 01:59:29

+0

不是我能看到的。 – 2013-02-13 02:00:25

回答

9

很明显,你的循环版本在语义上是相同的。但是,这不是唯一需要考虑的事情。

请注意,在while循环的下面还有第二个条件,即跳出循环。我怀疑这是什么促使作者使用while (true)

通过将其写为while (true)您提醒读者注意,while内必须有一个或多个休息时间。读者将不得不在循环中寻找休息时间,并希望能够找到它们。

随便读者可能会扫描代码的顶部,并假定while条件是循环终止的唯一途径。

另一点需要考虑的是对称性或平衡性。正如原作者所写,循环终止都是相同的形式。即从循环内部休息。你的版本感觉不对称。 while测试中的一个终止点,以及循环内另一个不同性质的终止点。

+2

评论不会杀死这个人! :) – 2013-02-13 02:03:06

2

作者有两个退出点,其中一个在退出循环之前打印出错误。在这种情况下,让代码稍微冗长些。当然,它可以用许多不同的方式编写。

相关问题