[英]how to upload multiple files using java
我希望有人可以帮助我(再一次)。
我有非常多的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站点用户名和密码的连接,然后发送文件,最后关闭连接?
这似乎比创建多个线程同时发送文件更容易。
任何建议都很受欢迎。
保罗
我不认为使用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();
这应该有所帮助。
如果您仍然需要更好的性能,除了使用多个线程之外,我没有看到任何其他选择。
经过大量测试后,我发现了多个ftp线程到公共服务器的可靠性问题,这是我在这种情况下所需要的。 大多数(如果不是全部)ftp服务器限制最大连接数,并限制来自同一IP地址的最大并发连接数。 来自同一IP的两个并发连接似乎是允许的唯一保证最大值。 上面建议的现实选项是压缩文件和ftp单个文件。 你可以使用php脚本解压缩文件(只要服务器支持解压缩,你需要检查它是否包含在php版本中)。 最后,如果像我这样你需要上传超过10,000个文件,许多ftp服务器将不会显示超过9998个文件(10,000个包含。和..)如果有人知道一个免费或便宜的ftp服务器支持在php构建中的ZipArchive并将在ftp中请求文件列表时,列出超过9998个文件,请您告诉我.....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.