2011-08-08 10 views
0

私はftpサーバーからファイルをダウンロードするjavaでダウンロードユーティリティを作っています。 URLConnectionクラスを使用してストリームオブジェクトとして接続と入力ストリームを確立しています。 私が直面している問題は、ネットワーク障害のシナリオ(具体的には )です。接続が失われ、接続が復元された後、特定のファイルをダウンロードしていたときに、以前に停止した場所からのダウンロードを再開します。 ダウンロードマネージャーのネットワーク障害の問題

は私が行っているfollをこれを達成するために: -

/*ここでは、私はそれがdownloading.Theを再開すべき場所からのストリーム内のポインタを取得するために、これまでにダウンロードされたバイト数をスキップしようとしていますskip()メソッドは、パラメータとして与えられたバイト数をスキップする必要はないため、whileループをスキップする必要があります。 */

while(totalByteSkipped!=downloaded) 
{ 
     bytesSkipped = stream.skip(downloaded-totalByteSkipped); 

     totalByteSkipped = totalByteSkipped+bytesSkipped; 
} 

しかし、手動で非常に多くのバイトをスキップするこのアプローチは非常に遅く、ダウンロードの全体的な時間に影響を与え、それゆえ、このような場合には、私はどこの時点で、ストリーム内のポインタを取得するためのメカニズムが必要ですダウンロードを停止しました。

同じアプローチで代替アプローチを得ることを願っています。 ありがとうございます!

答えて

0

ダウンロードを再開するには、FPT restartを実装する必要があります。サーバーがそれをサポートしている場合は、ファイル内のオフセットをそれに伝えることができます。

既存のFTPクライアントを使用していない理由はありますか? Commons Net FTP Clientは再起動をサポートしています。

+0

こんにちはVlad、 私は、sun.net.ftpパッケージからFtpClientを使用していました.pacheClientクラスを認識していませんでした。確かに、問題を解決するのに役立つかどうか試してみてください。 Thanx again :-) – shabeena

+0

@Shabeena:次にhttp://www.docjar.com/docs/api/sun/net/ftp/FtpClient.html#setRestartOffset%28long%29 – Vlad

+0

を使用してください。FtpClientには便利な方法はありません再起動のオフセットですが、ApacheのFTPClientは行います。 – shabeena

0

skip()はすべてのデータをダウンロードして破棄するだけなので、あなたにとっては役に立たないでしょう。サーバーは、これらのビットが破棄されたことを知らされず、クライアントで破棄されます。

あなたは間違った終わりを見ています。 FTPプロトコル(または使用しているもの)がこの動作を可能にしているかどうか、および使用するために送信する必要がある命令を確認します。さもなければ、彼らはあなたがそれを望まない場合でさえ、最初からすべてのデータをあなたに送り続けます。