0

現在、アプリでFTPクライアント用のcommons-netライブラリを使用しています。ファイル名に基づくいくつかの基準によって、リモートサーバーからいくつかのファイルをダウンロードする必要があります。これは私の実際のコードの非常に単純化された縮小バージョンです(いくつかのチェックを行い、すべての可能な例外をキャッチするため)が、本質はそこにあります:

//ftp is FTPClient object
//...
files = ftp.listFiles();
for (FTPFile ftpFile : files) {
    String name = ftpFile.getName();
    if(conformsCriteria(name)) {

        String path = outDirectory + File.separatorChar + name;
        os = new FileOutputStream(path);

        ftp.retrieveFile(name, os);
    }
}

さて、私が気付いたのは、このコードを実行し、数秒待ってからネットワークケーブルを抜くと、出力ディレクトリにいくつかの「空の」ファイルと実際にダウンロードされたファイルが含まれていることです。非同期で...しかし、ここでも、いくつかのファイルがダウンロードされ(サイズ> 0KB)、これらの空のファイル(サイズ= 0KB)があるため、まだシリアル化されたダウンロードであると私は信じています...また、関数retrieveFile()返品、ドキュメントを引用します:

正常に完了した場合はtrue、そうでない場合はfalse

失敗したダウンロードをすべてログに記録する必要があるため、必要なのはシリアル化されたダウンロードです。commons-netソースを参照しているのを見たのは、間違っていなければ、 retrieveFile()呼び出し
ごとに新しいソケットが作成されるということです。

私はこれについてかなり混乱しているので、誰かが実際に何が起こっているのかを説明し、このライブラリで解決策を提供したり、ファイルごとのダウンロードのブロックをサポートする他のFTPJavaライブラリを推奨したりできればそれは素晴らしいことです。

ありがとう。

4

2 に答える 2

2

java.net.URLConnection永遠に存在するクラスを使用することができます。FTPURLをうまく処理する方法を知っている必要があります。 これは、探しているブロッキング動作を与える簡単な例です。

注意点は、入出力ストリームを自分で管理する必要があるということですが、これは非常に単純なはずです。

于 2011-08-30T12:38:46.650 に答える
0

わかりました。この質問を目にする可能性のある人々を混乱させないために、これに簡単に答えてください。
はい、 FTP用のcommons-netは思ったとおりに機能しています。つまり、retrieveFile()メソッドは、ダウンロードが完了するまでブロックされます。
それは(もちろん)私が別のことを考えさせたのは、コードにおける私自身の「間違い」でした。

于 2011-11-11T15:49:38.787 に答える