2010-09-13 4 views
1

J'ai ce petit morceau de code ci-dessous qui télécharge un fichier dans Java, le code fonctionne correctement mais il reste longtemps pendant l'ouverture du flux de sortie.URLConnection lente à l'appel getOutputStream en utilisant une URL FTP

// open file to upload 
InputStream filein = new FileInputStream("/path/to/file.txt"); 

// connect to server 
URL url = new URL("ftp://user:[email protected]/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(); 

Dans cet exemple, la méthode URLConnection.getOutputStream() se bloque pendant environ 22 secondes avant de continuer normalement, le fichier est téléchargé avec succès. Dans ce cas, le fichier ne contient que 4 octets, juste un fichier texte avec le mot 'test' et le code se bloque avant le début du téléchargement, donc ce n'est pas parce qu'il prend le temps de télécharger le fichier. Cela ne se produit que lorsque je me connecte à un serveur, lorsque j'essaie un autre serveur, c'est aussi rapide que je pourrais espérer, ce qui me laisse penser qu'il s'agit d'un problème de configuration du serveur auquel cas cette question peut être plus appropriée , cependant, si je télécharge à partir d'un client FTP (dans mon cas, FileZilla) cela fonctionne très bien donc il pourrait y avoir quelque chose que je peux faire avec le code pour résoudre ce problème.

Des idées?

Répondre

1

J'ai résolu le problème en passant à Commons Net FTPClient, qui ne semble pas avoir les mêmes problèmes, ce qui change le code ci-dessous.

  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(); 
Questions connexes