3

I'm reading a book on Java, and we're on reading from a channel into a ByteBuffer. I found the way the author was structuring the while loop odd:

    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) {

I tried it like this:

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

and it works the same. Would there be a practical or code clarity reason the author would write it like he did?

4

2 回答 2

10

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

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

通过编写它来while (true)提醒读者注意在while. 读者将不得不在循环内部寻找中断,并希望能找到它们。

以您的方式编写,不经意的读者可能会扫描代码的顶部并假设while条件是循环终止的唯一方法。

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

于 2013-02-13T02:00:50.027 回答
2

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

于 2013-02-13T02:02:34.600 回答