4

我希望有人可以帮助我(再一次)。

我有大量的 smmll 文件(超过 4000 个),每个文件只有几 K。我用 java 编写了一个 FTP 程序,它将单独传输每个文件,但这需要很长时间。此外,握手开销似乎使问题变得更糟。

我想做的是打开 FTP 连接发送所有文件,然后再次关闭它。

我知道这在 FTP 中是可能的,但是如何在 java 中实现这一点超出了我的范围。

我目前将文件名放在一个数组中,因此解析它们是没有问题的。我尝试调用以下类并将文件名传递给它,但几个小时后它仍然每秒移动大约 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 在一个会话中发送多个文件是不可能的,这意味着您需要为每个文件打开和关闭会话的开销。

来自commons net的FTPClient确实支持一个会话中的多个操作。例如(省略异常处理):

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 的两个并发连接似乎是您被允许的唯一保证的最大值。上面建议的现实选项是压缩文件并 ftp 单个文件。当文件到达那里时,您可以使用 php 脚本解压缩文件(只要服务器支持解压缩,您需要检查它是否包含在 php 构建中)。最后,如果像我一样,您需要上传超过 10,000 个文件,许多 ftp 服务器不会显示超过 9998 个文件(10,000 个,包括 . 和 ..

于 2012-11-07T18:22:01.893 回答