如何使用java上传多个文件

时间:2012-10-21 19:31:17

标签: java file ftp

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

我有非常多的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站点用户名和密码打开连接, 然后发送文件 最后关闭连接?

这似乎比创建多个线程同时发送文件更容易。

任何有意义的建议。

2 个答案:

答案 0 :(得分: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();

这应该有所帮助。

如果您仍然需要更好的性能,除了使用多个线程之外,我没有看到任何其他选择。

答案 1 :(得分:0)

经过大量测试后,我发现了多个ftp线程到公共服务器的可靠性问题,这是我在这种情况下所需要的。大多数(如果不是全部)ftp服务器限制最大连接数,并限制来自同一IP地址的最大并发连接数。来自同一IP的两个并发连接似乎是允许的唯一保证最大值。上面建议的现实选项是压缩文件和ftp单个文件。你可以使用php脚本解压缩文件(只要服务器支持解压缩,你需要检查它是否包含在php版本中)。最后,如果像我这样你需要上传超过10,000个文件,许多ftp服务器将不会显示超过9998个文件(10,000个包含。和..) 如果有人知道在php版本中支持ZipArchive的免费或便宜的ftp服务器,并且在请求ftp中的文件列表时会列出超过9998个文件,请你告诉我.....