URLConnection使用FTP URL调用getOutputStream很慢

时间:2010-09-13 13:59:34

标签: java ftp

我在下面有一小段代码,用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)上传它可以正常工作,那么我可以使用代码修复此问题。

有什么想法吗?

1 个答案:

答案 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();