3

OpenJDK7プロジェクトjava.nio.file.Filesには、以下の関数があります。私の質問は、whileループ条件を>ではなく>=にする必要があるかどうかです。これは、source.read javadocが、EOFに達すると、0ではなく-1を返すと言っているためです。

/**
 * Reads all bytes from an input stream and writes them to an output stream.
 */
private static long copy(InputStream source, OutputStream sink)
    throws IOException
{
    long nread = 0L;
    byte[] buf = new byte[BUFFER_SIZE];
    int n;
    while ((n = source.read(buf)) > 0) {
        sink.write(buf, 0, n);
        nread += n;
    }
    return nread;
}
4

3 に答える 3

1

InputStream.read(byte[])ここでは0が返されないため、同じです。javadocから

少なくとも1バイトが読み取られます

于 2012-11-27T15:30:45.660 に答える
1

これがバグであるかどうかは、関数の意図に依存します。

readへの呼び出しは、少なくとも 1 バイトのデータが使用可能になるまでブロックされるため、通常、これは期待どおりに機能します。ただし、入力ストリームが非ブロッキングの場合、現在使用可能なデータがなくなると、read呼び出しは 0 を返します。この状態は、アクティブに閉じられているストリームとは異なります。

つまり、メソッドが呼び出された時点で利用可能なデータを持たないノンブロッキング ストリームに直面したときに何を期待するかに応じて、これがバグであるかどうかを議論することができます。

于 2012-11-27T08:56:03.743 に答える
1

間違った読み取り関数を見ています。バイト配列を受け取る InputStream の read 関数は、バッファにコピーされたバイト数を返します。したがって、そこからコピーできるバイト数を知ることができます。

 * @return     the total number of bytes read into the buffer, or
 *             <code>-1</code> if there is no more data because the end of
 *             the stream has been reached.

したがって、両方のケースをカバーします。ストリームの終わりに達した (-1) か、その他の理由でバイトがバッファに読み込まれませんでした。

于 2012-11-27T07:40:24.587 に答える