1

私はJavaOOPを学んでいます。私のプログラムはFTP経由でファイルをダウンロードします。再開したらダウンロードを再開したい。これが私のコードです:

URL urlName = new URL(url);
URLConnection con = urlName.openConnection();
BufferedInputStream in = new BufferedInputStream(con.getInputStream());

int i = 0;
long downloadedSizeKB;
System.out.println("before skip");
long k = in.skip(counter);
System.out.println(k);
byte[] bytesIn = new byte[1024];
while ((i = in.read(bytesIn)) >= 0) {
    if(counter >= alreadyDownloadedBytes) {
        out.write(bytesIn, 0, i);
        downloadedSizeKB = counter/1024;
        downSize.setText(downloadedSizeKB + " KB downloaded...");

        while(isPaused) {
            downSize.setText(downloadedSizeKB + " KB PAUSED");
            Thread.sleep(1000);                     
        }
    }
    counter += i;
}

in.close();

最初は、以前にダウンロードしたファイルの長さと同じくらいそれを読み取ってみて、それからその時点から読み取りと書き込みを再開しました。ダウンロードを再開する前にファイルを読み取るのに時間がかかりすぎます(100MBの場合は1〜2分)。その後、スキップ方法があることに気づきましたが、ほぼ同じ時間がかかるので、同じことをしていると思います。

ファイルの特定のバイトからファイルの読み取りを開始するより速い方法はありますか?それとも私はこれを別の方法で行う必要がありますか?それともこれが唯一の方法ですか?

4

2 に答える 2

2

apache.commons.net.ftp.FTPClient(commons-net.jarライブラリにあります)を使用できます。

次のようなメソッドがあります:setRestartOffset(yourOffset)、ファイルを取得する前にそれを使用すると、ファイルデータは指定されたオフセットから開始されます。

于 2012-10-17T08:36:12.307 に答える
0

FTPの詳細はまだ調べていませんが、はい、入力ストリームをスキップすると、すでに読み取られたバイトが読み取られます。あなたがする必要があるのは、あなたがまだ持っていないバイトだけを送るようにサーバーに指示することです。

HTTPおよびFTPでは、これはRANGEヘッダーです。この質問には、FTPでこれを行う方法の詳細があります。

于 2012-10-17T08:25:17.707 に答える