我正在读一本关于Java的书,我们正在从一个频道读到一个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(inCh.read(lengthBuf) != -1) {
它的工作方式相同。是否会有一个实际或代码清晰的原因,作者会像他一样写出来?
答案 0 :(得分:10)
很明显,你的循环版本在语义上是相同的。但是,这不是唯一要考虑的事情。
请注意,在while
循环的下方还有第二个条件会突破循环。我怀疑这是促使作者使用while (true)
的原因。
通过将其写为while (true)
,您可以提醒读者while
内必须有一个或多个中断。读者将不得不在循环内部查看休息时间,并希望能够找到它们。
按照自己的方式编写,随意的读者可能会扫描代码的顶部,并认为while
条件是循环终止的唯一方法。
要考虑的另一点是对称性或平衡性。正如原作者所写,循环终止都是相同的形式。即从循环内打破。你的版本感觉不对称。 while
测试中的一个终止点,以及循环内的另一个不同性质的终止点。
答案 1 :(得分:2)
作者有两个退出点,其中一个退出点在退出循环之前打印出错误。在这种情况下,只需使代码更加冗长。当然,它可以用许多不同的方式编写。