10

Java API ドキュメントと Java コードの説明と確認をどこで求めればよいか分からないので、ここで行います。

の API ドキュメントでFileChannel、オフ バイ ワン エラー wrt to filepositionおよびsize複数の場所でのファイルを見つけました。

これはほんの一例です。州の API ドキュメントtransferFrom(...):

「指定された位置がファイルの現在のサイズより大きい場合、バイトは転送されません。」

OpenJDKコードにもこのコードが含まれていることを確認しました...

public long transferFrom(ReadableByteChannel src, long position, long count)
    throws IOException
{
    // ...
    if (position > size())
        return 0;
    // ...
}

FileChannelImpl.java...ドキュメントと一致するファイル内。

さて、上記のコード スニペットと API ドキュメントは相互に一貫しているように見えますが、ファイルのデータへの 0 ベースのインデックスであるため、上記は単なる「より大きい」ではなく「以上」であるべきだと「感じます 。での読み取りには、呼び出し元に返すデータがありません! ( では、少なくとも 1 バイト (ファイルの最後のバイト) が呼び出し元に返される可能性があります。)positionposition == size()position == size() - 1

同じ API ドキュメント ページにある他の同様のインスタンスを次に示します。

  1. position(...): "位置をファイルの現在のサイズより大きい値に設定することは正当ですが、ファイルのサイズは変更されません。" (「以上」である必要があります。)

  2. transferTo(...): "指定された位置がファイルの現在のサイズより大きい場合、バイトは転送されません。" (「以上」である必要があります。)

  3. read(...): "指定された位置がファイルの現在のサイズより大きい場合、バイトは読み取られません。" (「以上」である必要があります。)

最後に、 の戻り値に関するドキュメント セクションはread(...)、残りのドキュメントとの一貫性さえ保っていません。ここにそれが述べているものがあります:

read(...)

戻り値:

読み取られたバイト数。場合によってはゼロ、または指定された位置がファイルの現在のサイズ以上の場合は -1

したがって、この唯一の例では、彼らが正しいことを述べているのを見ます。

全体として、私はこれらすべてをどうすればよいかわかりません。今日、このドキュメントに一致するコードを書いた場合、Java (コードまたはドキュメント) の将来のバグ修正によってコードがバグだらけになり、私の側でも修正が必要になります。今日の状態で正しいことを自分で行うと、最初からコードにバグが発生します。

4

2 に答える 2

2

動作に問題がないという点で、off-by-one バグではありませんよね?せいぜいドキュメントの問題です。ここのドキュメントは間違っていません。おそらく完全ではないだけです。

しかし、彼らに何かが欠けているかどうかはわかりません。position == size()例外的な状況ではありません。定義上、0バイトが読み取れる状況です。position > size()例外的です: 0 バイト未満しか読み取ることができません。メモが必要です。例外がスローされますか? または何もありません。read()バイトを返す必要があるため、0を読み取ることも例外的な条件です。

個人的には、あなたが尋ねているという事実は、ドキュメントがより明確になる可能性があることを意味すると思います。また、0 バイトを転送しようとするのではなく、そのメソッドが短絡しない理由も明らかではありません。しかし、その背後には考えられるロジックがあるようです。

(または、文書化されていないことをするという意味ですか?)

于 2013-12-01T06:10:49.117 に答える