3

在 OpenJDK7 项目java.nio.file.Files中,有如下函数。我的问题是,while 循环条件应该是 >= 而不是 >?这是因为 source.read javadoc 说当到达 EOF 时,它将返回 -1 而不是 0。

/**
 * 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 的读取函数接受一个字节数组,将返回已复制到缓冲区的字节数。因此,您可以知道可以从中复制多少字节。

 * @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 回答
1

这是否是错误取决于函数的意图。

通常这将完全按照您的预期工作,因为调用read将阻塞,直到至少一个字节的数据可用。但是,如果输入流是非阻塞的,则当当前没有更多可用数据时,read调用将返回 0 。此状态与主动关闭的流不同。

换句话说,有人可能会争辩这是否是一个错误,这取决于您在面对调用该方法时没有可用数据的非阻塞流时期望它做什么。

于 2012-11-27T08:56:03.743 回答
1

一样,因为InputStream.read(byte[])这里不会返回 0。来自 javadoc

至少读取一个字节

于 2012-11-27T15:30:45.660 回答