我希望有人可以帮助我(再一次)。
我有非常多的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站点用户名和密码打开连接, 然后发送文件 最后关闭连接?
这似乎比创建多个线程同时发送文件更容易。
任何有意义的建议。
保
答案 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个文件,请你告诉我.....