0

1021バイトのブロックで任意のサイズのファイルを読み込んでいます。ファイルの最後のブロックのブロックサイズは1021バイト以下です。現時点では、aBufferedInputStreamをラップしてFileInputStream、次のように(大まかに)コードを使用してこれを行っています(ここreaderで、BufferedInputStreamこれはループで動作しています)。

int availableData = reader.available();
int datalen = (availableData >= 1021) 
                ? 1021 
                : availableData;
reader.read(bufferArray, 0, datalen);

ただし、APIドキュメントを読むとavailable()、呼び出しが「ブロック」される前に、使用可能なサイズの「見積もり」のみが示されることに注意してください。各反復の値を出力するavailableDataと、期待値が得られるようです-ファイルサイズから始めて、<= 1021になるまで徐々に小さくなります。これがローカルファイルであるとすると、これが正しい値であると期待するのは間違っていますか?available()間違った答えを出す状況はありますか?

編集:申し訳ありませんが、追加情報。はBufferedInputStreamに巻き付けられていFileInputStreamます。FISのソースコードから、ローカルファイルの場合に残っているデータ量の尺度としてavailable()を信頼するのが安全だと思います。私は正しいですか?

4

2 に答える 2

2

質問は無意味です。これらの4行のコードは、これと完全に同等です。

reader.read(buffer, 0, 1021);

available()呼び出しと読み取りの間に導入したタイミングウィンドウの問題はありません。戻り値(EOSでは-1、または1から1021まで)を無視しているため、このコードはまだ正しくないことに注意してください。

于 2011-03-16T00:46:03.607 に答える
1

推定サイズではなく、読み取ることができる残りのバイト数を示します。による見積もりではありませんBufferedInputStream

この入力ストリームからブロックせずに読み取ることができるバイト数を返します。

available()ブロックを回避したい場合は、呼び出しに直接渡す必要がありread()ますが、戻り値が0または-1の場合は必ず戻るようにしてください。available()操作をサポートしないバッファタイプで例外をスローする場合があります。

于 2011-03-15T20:53:19.987 に答える