4

誰かが私を助けてくれることを願っています(もう一度)。

非常に多数の smmll ファイル (4000 以上) があり、それぞれ数 K しかありません。各ファイルを個別に転送する FTP プログラムを Java で作成しましたが、非常に長い時間がかかります。また、ハンドシェークのオーバーヘッドが問題を悪化させているようです。

私ができるようにしたいのは、FTP接続を開いてすべてのファイルを送信してから、もう一度閉じることです。

これが FTP で可能であることは知っていますが、Java でこれを達成する方法は私にはわかりません。

現在、配列にファイル名があるため、それらを解析しても問題ありません。次のクラスを呼び出してファイル名を渡そうとしましたが、数時間後も1秒あたり約1ファイル移動していました。

    package website;

    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;

    public class ftpUpload {

public ftpUpload(String target, String savename, String localFilePath) {

    URL url;
    try {
        url = new URL(target + savename + ";type=i");

        URLConnection con = url.openConnection();
        BufferedOutputStream out = 
            new BufferedOutputStream(con.getOutputStream());
        FileInputStream in = 
            new FileInputStream(localFilePath + savename);

        int i = 0;
        byte[] bytesIn = new byte[1024];
        while ((i = in.read(bytesIn)) >= 0) {
            out.write(bytesIn, 0, i);
        }
        out.close();
        in.close();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

    }

ftp サイトのユーザー名とパスワードで接続を開き、ファイルを送信して最後に接続を閉じる方法はありますか?

これは、複数のスレッドを作成してファイルを同時に送信するよりも簡単に思えます。

どんなアドバイスも大いに受けました。

ポール

4

2 に答える 2

1

URLConnection を使用して 1 つのセッションで複数のファイルを送信することはできないと思います。これは、ファイルごとにセッションを開いたり閉じたりするオーバーヘッドが発生することを意味します。

commons netのFTPClient は、1 つのセッションで複数の操作をサポートしています。例 (例外処理は省略):

FTPClient ftp = new FTPClient();
ftp.connect("ftp.example.com");
ftp.login("admin", "secret");
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

for(File file : files) {
    InputStream in = new FileInputStream(file);
    ftp.storeFile(file.getName(), in);
    in.close();
}

ftp.disconnect();

これは役立つはずです。

それでもパフォーマンスを向上させる必要がある場合は、複数のスレッドを使用する以外に方法はありません。

于 2012-10-21T22:39:12.610 に答える
0

たくさんのテストを行った結果、パブリックサーバーへの複数のftpスレッドに信頼性の問題があることがわかりました。これは、この場合に必要な問題です。ほとんどの(すべてではないにしても)ftpサーバーは、接続の最大数を制限し、同じIPアドレスからの同時接続の最大数も制限します。同じIPからの2つの同時接続が、許可される唯一の保証された最大値のようです。上で提案した現実的なオプションは、ファイルをzipして、単一のファイルをftpで転送することです。phpスクリプトを使用して、ファイルがそこに到達したときに解凍できます(サーバーが解凍をサポートしている限り、これがphpビルドに含まれているかどうかを確認する必要があります)。最後に、私のように10,000を超えるファイルをアップロードする必要がある場合、多くのftpサーバーは9998を超えるファイルを表示しません(10,000を含む。および。。

于 2012-11-07T18:22:01.893 に答える