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 バイト (ファイルの最後のバイト) が呼び出し元に返される可能性があります。)position
position == size()
position == size() - 1
同じ API ドキュメント ページにある他の同様のインスタンスを次に示します。
position(...)
: "位置をファイルの現在のサイズより大きい値に設定することは正当ですが、ファイルのサイズは変更されません。" (「以上」である必要があります。)transferTo(...)
: "指定された位置がファイルの現在のサイズより大きい場合、バイトは転送されません。" (「以上」である必要があります。)read(...)
: "指定された位置がファイルの現在のサイズより大きい場合、バイトは読み取られません。" (「以上」である必要があります。)
最後に、 の戻り値に関するドキュメント セクションはread(...)
、残りのドキュメントとの一貫性さえ保っていません。ここにそれが述べているものがあります:
戻り値:
読み取られたバイト数。場合によってはゼロ、または指定された位置がファイルの現在のサイズ以上の場合は -1
したがって、この唯一の例では、彼らが正しいことを述べているのを見ます。
全体として、私はこれらすべてをどうすればよいかわかりません。今日、このドキュメントに一致するコードを書いた場合、Java (コードまたはドキュメント) の将来のバグ修正によってコードがバグだらけになり、私の側でも修正が必要になります。今日の状態で正しいことを自分で行うと、最初からコードにバグが発生します。