我在下面有一小段代码,用java上传文件,代码正常运行但是在打开输出流时它会挂起很长时间。
// open file to upload
InputStream filein = new FileInputStream("/path/to/file.txt");
// connect to server
URL url = new URL("ftp://user:pass@host/dir/file.txt");
URLConnection urlConn = url.openConnection();
urlConn.setDoOutput(true);
// write file
// HANGS FROM HERE
OutputStream ftpout = urlConn.getOutputStream();
// TO HERE for about 22 seconds
byte[] data = new byte[1024];
int len = 0;
while((len = filein.read(data)) > 0) {
ftpout.write(data,0, len);
}
// close file
filein .close();
ftpout.close();
在此示例中,URLConnection.getOutputStream()方法挂起约22秒,然后正常继续,文件已成功上载。在这种情况下,文件只有4个字节,只是一个文本文件,其中包含“test”字样,代码在上传开始之前挂起,所以不是因为上传文件需要时间。
这只发生在连接到一台服务器时,当我尝试使用不同的服务器时,我希望它能让我认为这是一个服务器配置问题,在这种情况下,这个问题可能更适合服务器故障,但是,如果我从FTP客户端(在我的案例中是FileZilla)上传它可以正常工作,那么我可以使用代码修复此问题。
有什么想法吗?
答案 0 :(得分:1)
我已经通过切换到使用Commons Net FTPClient解决了这个问题,而这个问题并不会产生相同的问题,这些问题会将代码更改为以下内容。
InputStream filein = new FileInputStream(new File("/path/to/file.txt"));
// create url
FTPClient ftp = new FTPClient();
ftp.connect(host);
ftp.login(user, pass);
int reply = ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.err.println("FTP server refused connection.");
return;
}
OutputStream ftpout = ftp.appendFileStream("text.txt");
// write file
byte[] data = new byte[1024];
int len = 0;
while((len = filein.read(data)) > 0) {
ftpout.write(data,0, len);
}
filein.close();
ftpout.close();
ftp.logout();