現在、アプリで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ライブラリを推奨したりできればそれは素晴らしいことです。
ありがとう。