JDK7 Files.copy

时间:2012-11-27 07:32:32

标签: java file stream inputstream java-7

在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;
}

3 个答案:

答案 0 :(得分: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)或者由于任何其他原因没有字节读入缓冲区。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

  

至少读取一个字节