使用http协议寻找(跳过)输入流的最快方法

时间:2011-01-25 14:53:33

标签: android inputstream seek

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

                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()+"-");  
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

看看这里:

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

答案 2 :(得分:0)

你可以这样做:

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重新连接到新的偏移量。工作快速可靠,比使用输入流的跳过要好得多。