InputStream中的skip()方法如何工作?

时间:2012-01-31 09:17:53

标签: java

InputStream is = new URL(someUrl).openStream();
long length = is.skip(Long.MAX_VALUE);

当我调用is.skip(Long.MAX_VALUE)时,它是在返回值之前下载文件,还是实际跳过给定的字节数(假设大小小于MAX_VALUE)?

5 个答案:

答案 0 :(得分:7)

如果你追踪OpenJDK(假设你有网络连接),你可以SocketInputStream.skip(long)

/**
 * Skips n bytes of input.
 * @param n the number of bytes to skip
 * @return  the actual number of bytes skipped.
 * @exception IOException If an I/O error has occurred.
 */
public long skip(long numbytes) throws IOException {
    if (numbytes <= 0) {
        return 0;
    }
    long n = numbytes;
    int buflen = (int) Math.min(1024, n);
    byte data[] = new byte[buflen];
    while (n > 0) {
        int r = read(data, 0, (int) Math.min((long) buflen, n));
        if (r < 0) {
            break;
        }
        n -= r;
    }
    return numbytes - n;
}

这似乎是在连接关闭之前读取所有数据(或者你读取了9个Exa字节;)

编辑:最大读取大小为1024字节略微令人惊讶,因为1.5 KB的数据包相当普遍(发送大量数据时)

答案 1 :(得分:1)

来自docs

  

跳过并丢弃输入流中的n个字节数据。

     

由于各种原因,skip方法可能最终跳过一些较小的字节数,可能为0.如果n为负数,则抛出IOException,即使InputStream超类的skip方法在此处不执行任何操作案件。返回跳过的实际字节数。

     

此方法可能会跳过比备份文件中剩余的更多字节。这不会产生异常,跳过的字节数可能包括超出后备文件EOF的一些字节数。跳过结束后尝试从流中读取将导致-1表示文件结束。

答案 2 :(得分:0)

查看JDK6 HTTP client的实现,您看不到skip方法的特殊处理。这意味着(默认情况下,假设您没有像在请求上配置范围标题那样精心设计),您将一次读取所有这些字节。块大小本身是可变的(Peter Lawrey为1024字节提供了一个很好的例子),但它将受到IP层MTU的限制,即通常大约1500字节。

发布的代码将下载整个文件。遗憾。

答案 3 :(得分:0)

跳过方法将跳过已经传递的字节块。 有关更多信息,请参阅 http://www.roseindia.net/tutorial/java/corejava/zip/skip.html

答案 4 :(得分:0)

跳过并丢弃输入流中的n个字节的数据。由于各种原因,skip方法可能最终跳过一些较小的字节数,可能为0.返回跳过的实际字节数。

例如看到这个: skip() example