InputStream is = new URL(someUrl).openStream();
long length = is.skip(Long.MAX_VALUE);
当我调用is.skip(Long.MAX_VALUE)
时,它是在返回值之前下载文件,还是实际跳过给定的字节数(假设大小小于MAX_VALUE
)?
答案 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