1

私は多くの例を見て、私が間違っていることを理解しようとしましたが、成功しませんでした.多分あなたは私を助けることができます. 常に 2 番目のファイルで停止しますが、最初のファイルは c:\ にサイズ 0kb で作成されます。files_server.get(i) は、ダウンロードしたいすべてのファイルを含む ArrayList です。

私のコード:

public FTPConnection() {

StartD std = new StartD();
std.start();
}

class StartD extends Thread{

        @Override
        public void run()
        {
        for (int i = 0; i < files_server.size(); i++) {
            err = ftpDownload(files_server.get(i), "C:/"+ files_server.get(i)); 
            if (!err) 
                {
                System.out.println("Error in download, breaking");
                break;
                }
            }
        }

        public boolean ftpDownload(String srcFilePath, String desFilePath) 
        {
        try {
            FileOutputStream desFileStream = new FileOutputStream(desFilePath);
            InputStream input = mFTPClient.retrieveFileStream(srcFilePath);
            byte[] data = new byte[1024];
            int count;
            while ((count = input.read(data)) != -1) 
            {
                desFileStream.write(data, 0, count);
            }
            desFileStream.close();

        } catch (Exception e) {

            return false;
        }
    return true;

    }}

関数を使用する場合:

public boolean ftpDownload(String srcFilePath, String desFilePath) {
        boolean status = false;
        try {

            FileOutputStream desFileStream = new FileOutputStream(desFilePath);
            status = mFTPClient.retrieveFile(srcFilePath, desFileStream);
            desFileStream.close();
            return status;
        } catch (Exception e) {

        }
        return status;
    }

代わりに、すべて正常に動作しますが、ファイルのダウンロードの進行状況を監視できません。

4

2 に答える 2

2

FTPではなくファイルの解凍にのみ使用しましたが、その場合、InputStreamバッファーはゼロを返す可能性があるため、whileループを次のように変更してみる価値があります。

while ((count = input.read(data)) >= 0)

public int read(byte [] b)はIOExceptionをスローします

入力ストリームからいくつかのバイトを読み取り、それらをバッファ配列に格納します。実際に読み取られたバイト数は整数として返されます。このメソッドは、入力データが使用可能になるか、ファイルの終わりが検出されるか、例外がスローされるまでブロックします。

bの長さがゼロの場合、バイトは読み取られず、0が返されます。

また、カウントを2回割り当てている可能性もあります。これにより、データから最初のバイトが切り取られる可能性があります。

int count  = input.read(data);
while ((count = input.read(data)) != -1)

したがって、宣言するときにカウントするものを割り当てないでください。

于 2012-08-15T08:01:38.990 に答える
1

ライブラリがcommons-netパッケージのFTPクライアントであると仮定しましょう。コードを実行できず、説明(2番目のファイルが停止する)が不十分であるため(例外がスローされますか?永久にハングしますか?サイドなしで完了しますか?)、コードの何が問題になっているのかを理解するのは簡単ではありません。効果?)。とにかく私はいくつかのアドバイスがあります:

  1. CountingOutputStream(Apache commons-ioから)を使用して進行状況を監視します
  2. を使用して、ProtocolCommandListener何が起こっているかをログに記録します

また、最初の1024バイトは常に失われることに注意してください。最終的に、サーバー上に同じ名前のファイルをC:\に配置することがどれほど安全かわかりません。せいぜい、許可の問題につながる可能性があり、最悪の場合、セキュリティ上の欠陥が発生する可能性があります。ファイル名をある程度制御できる場合は、とにかくこれは当てはまりませんが、このアドバイスを検討してください。

これはサンプルクライアントです

public class FTP {

    public static void main(String[] args) throws SocketException, IOException {
        FTPClient client = new FTPClient();

        client.addProtocolCommandListener(new ProtocolCommandListener(){

            @Override
            public void protocolCommandSent(ProtocolCommandEvent evt) {
                logger.debug(evt.getMessage());

            }

            @Override
            public void protocolReplyReceived(ProtocolCommandEvent evt) {
                logger.debug(evt.getMessage());
            }

        });

        client.connect("ftp.mozilla.org");
        client.login("anonymous", "");
        client.enterLocalPassiveMode();

        OutputStream out = new CountingOutputStream(new NullOutputStream()) {
            @Override
            public void beforeWrite(int count) {
                super.beforeWrite(count);
                logger.info("Downloaded " + getCount() + " bytes");
            }
        };

        for (String filename: new String[] {"MD5SUMS", "SHA1SUMS"})
            client.retrieveFile("pub/firefox/releases/15.0b4/" + filename, out);

        out.close();
        client.disconnect();
    }

    private static Logger logger;

    static  {
        logger = Logger.getLogger(FTP.class.getCanonicalName());
    }

}

構成が完了すると、ロガーはすべてのrawソケット会話を出力します。これは、アプリケーションIOではなくFTP側にある場合、問題をよりよく理解するのに役立つ場合があります。

于 2012-08-15T14:49:26.123 に答える