2

我正在制作各种下载服务,它能够恢复以前的部分下载。我目前正在使用这样的跳过方法

                long skipped = 0;
                while (skipped < track.getCacheFile().length()){
                    skipped += is.skip(track.getCacheFile().length()-skipped);

                }

我刚刚做了一个测试,在输入流中跳过 45 mb 大约需要 57 秒。我很好奇某些本机代码是如何做到这一点的,例如,媒体播放器可以立即搜索远程流的任何部分。我意识到我无法访问相同的库,但我可以实现类似的东西。

顺便说一句,那个测试是在wifi上的。在普通数据网络上,它显然要慢得多。

更新:非常简单(感谢下面)

if (track.getCacheFile().length() > 0){
    request.setHeader("Range","bytes="+track.getCacheFile().length()+"-");  
}
4

3 回答 3

2

跳过方法的问题在于,即使您跳过它们,您也必须读取数据,因此您需要接收它们。最好的解决方案可能是只请求服务器您想要的部分。

于 2011-01-25T15:33:34.117 回答
2

如果您使用 http 作为协议来启动您的输入流,您可以尝试使用 RANGE 标头。

看看这里:

http://www.west-wind.com/Weblog/posts/244.aspx

于 2011-01-25T15:41:37.603 回答
1

你可以这样做:

private InputStream getRemote(String url, long offset) {
    try {
        URLConnection cn = new URL( url ).openConnection();
        cn.setRequestProperty ("Range", "bytes="+offset+"-");
        cn.connect();
        length = cn.getContentLength();
        return cn.getInputStream();
    } catch (MalformedURLException e ) { e.printStackTrace();
    } catch (IOException e) { e.printStackTrace(); }

    return null;
}

然后,当您需要跳过时,您实际上是通过 HTTP 重新连接到新的偏移量。工作快速可靠,比使用输入流的跳过好得多。

于 2014-07-24T11:43:22.080 回答