3

私は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)
                    壊す;
                lengthBuf.flip();

                strLength =(int)lengthBuf.getDouble();

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

                if(inCh.read(buffers)== -1){
                    System.err.println( "EOFがhteprime文字列の読み取りを検出しました。");
                    壊す;
                }

                System.out.printf( "文字列の長さ:%3s文字列:%-12sバイナリ値:%3d%n"、strLength、
                                    ((ByteBuffer)(buffers [0] .flip()))。asCharBuffer()。toString()、
                                    ((ByteBuffer)buffers [1] .flip())。getLong());

                lengthBuf.clear();
                buffers [1] .clear();
            }
            System.out.println( "\ nEOFに到達しました。");
        } catch(IOException e){

私はこのようにそれを試しました:

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

そしてそれは同じように機能します。作者が彼のようにそれを書くという実用的またはコードの明確さの理由はありますか?

4

2 に答える 2

10

ループのバージョンが意味的に同一であることは明らかです。ただし、考慮すべきことはそれだけではありません。

ループのさらに下に、whileループから抜け出す2番目の条件があることに注意してください。これが作者が使用する動機となったのではないかと思いますwhile (true)

あなたが読者に警告するときにそれを書くことによってwhile (true)、内部に1つ以上の休憩がなければならないという事実をwhile。読者はループ内で休憩を探す必要があり、うまくいけば両方を見つけるでしょう。

whileあなたのやり方で書かれた、カジュアルな読者はコードの先頭をスキャンして、条件がループを終了する唯一の方法であると想定するかもしれません。

考慮すべきもう1つのポイントは、対称性、つまりバランスです。元の作者が書いたように、ループの終了はすべて同じ形式です。つまり、ループ内からブレークします。あなたのバージョンは非対称に感じます。テスト内の1つの終了ポイントとwhile、ループ内の異なる性質の別の終了ポイント。

于 2013-02-13T02:00:50.027 に答える
2

作成者には2つの終了ポイントがあり、そのうちの1つは、ループを終了する前にエラーを出力します。その場合、コードをもう少し冗長にします。もちろん、さまざまな方法で書くことができます。

于 2013-02-13T02:02:34.600 に答える