2011-01-25 10 views
2

私はソートのダウンロードサービスを作成しており、前回の部分ダウンロードを再開することができます。私は現在、私はちょうどテストを行なったし、それは入力ストリームに45メガバイトをスキップするのに約57秒の秒を要したこのhttpプロトコルで入力ストリームをシーク(スキップ)する最速の方法

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

       } 

ようskipメソッドを使用しています。特定のネイティブコードがこれをどのようにして行うのか、私は興味があります。例えば、メディアプレイヤーはリモートストリームのどの部分にも瞬時に求めることができます。私は同じライブラリにアクセスすることはできませんが、私は同様のことを達成できますか?

btw、そのテストはwifiで行われました。通常のデータネットワークでは明らかにはるかに遅いです。

アップデート:非常に単純な(以下のおかげで)

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

答えて

2

入力ストリームを開始するためのプロトコルとしてhttpを使用している場合は、RANGEヘッダーを試すことができます。

こちらをご覧ください:

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

+0

よろしくお願いします。それを撃つ。 –

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経由で再接続を行うオフセット。入力ストリームのスキップを使用するよりもはるかに優れています。

関連する問題