【问题标题】:JDK7 Files.copyJDK7 文件.copy
【发布时间】:2012-11-14 18:54:06
【问题描述】:

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

【问题讨论】:

    标签: java file stream inputstream java-7


    【解决方案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) 或由于任何其他原因没有将字节读入缓冲区。

    【讨论】:

    • 该函数的 javadoc 说它将从输入流中读取所有字节。如果它的连接不佳并且下一个字节可能无法立即使用,则 while 循环将在获取所有字节之前结束。不是吗?
    • @tanyehzheng 不正确。 InputStream.read 的 javadocs 说至少会返回一个字节,否则会阻塞。如果除 EOF 之外的任何原因无法读取第一个字节,则它会抛出 IOException。任何为此函数返回 0 的流都被错误地写入,并且没有正确地继承 InputStream。 (除非缓冲区是一个长度为零的数组,即。)
    【解决方案2】:

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

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

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

    【讨论】:

    • 如果条件变为>= 0,那么无论是阻塞模式还是非阻塞模式,都会按预期工作。不是吗?
    • 这取决于您的期望。当没有更多可用数据时,您希望它阻止吗?此外,如果你这样做了,并且流是非阻塞的,那么在等待下一个数据字节时,你最终会消耗 100% 的 CPU。这不是很好。
    【解决方案3】:

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

    至少读取一个字节

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多