Самый быстрый способ поиска (пропустить) входной поток с протоколом http - PullRequest
2 голосов
/ 25 января 2011

Я делаю что-то вроде загрузки, и у нее есть возможность возобновить предыдущую частичную загрузку. В настоящее время я использую метод пропуска, как это

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

                }

Я только что провел тест, и мне потребовалось около 57 секунд, чтобы пропустить 45 Мб во входном потоке. Мне любопытно, как определенный нативный код делает это, например, медиаплеер может мгновенно искать любую часть удаленного потока. Я понимаю, что у меня нет доступа к тем же библиотекам, но могу ли я достичь чего-то похожего.

Кстати, этот тест был на Wi-Fi. Это очевидно намного медленнее в обычных сетях передачи данных.

Обновление: очень просто (спасибо ниже)

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

Ответы [ 3 ]

2 голосов
/ 25 января 2011

Если вы используете http в качестве протокола для запуска вашего входного потока, вы можете попробовать заголовок RANGE.

Взгляните сюда:

http://www.west -wind.com / Weblog / сообщений / 244.aspx

2 голосов
/ 25 января 2011

Проблема с методом пропуска заключается в том, что вам нужно читать данные, даже если вы пропускаете их, поэтому вам нужно их получить. Лучшее решение, вероятно, состоит в том, чтобы запросить у сервера только ту часть, которую вы хотите.

0 голосов
/ 24 июля 2014

Вы можете сделать это так:

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 к новому смещению. Работает быстро и надежно, намного лучше, чем использование пропуска входного потока.

...