J'ai une liste de fichiers qui doivent être lus à partir du serveur FTP.
J'ai une méthode readFile (String path, FTPClient client)
qui lit et imprime le fichier.
public byte[] readFile(String path,FTPClient client){ InputStream inStream = null; ByteArrayOutputStream os = null; byte[] finalBytes = new byte[0]; int reply; int len; byte[] buffer = new byte[1024]; try{ os = new ByteArrayOutputStream(); inStream = client.retrieveFileStream(path); reply = client.getReplyCode(); log.warn("In getFTPfilebytes() :: Reply code -"+reply); while ((len = inStream.read(buffer)) != -1) { // write bytes from the buffer into output stream os.write(buffer, 0, len); } finalBytes = os.toByteArray(); if(inStream == null){ throw new Exception("File not found"); } inStream.close(); }catch(Exception e){ }finally{ try{ inStream.close();} catch(Exception e){} } return finalBytes; }
J'appelle la méthode ci-dessus en boucle de liste qui contient des chaînes de chemin du fichier.
Problème - En boucle, seul le premier fichier est lu correctement. Ensuite, il ne lit pas le fichier et lève une exception. inStream
donne NULL pour la deuxième itération / deuxième fichier. De plus, lors de l'itération du premier code de réponse de fichier après retrieveFileStream
, "125 (Connexion de données déjà ouverte; transfert en cours.) "
Dans la deuxième itération, cela donne "200 (L'action demandée a été exécutée avec succès.)"
Je ne suis pas en mesure de comprendre ce qui ne va pas ici.
Vous n'avez pas fermé correctement la connexion inputstream
?
3 Réponses :
Selon le documentation de la méthode FTPClient.retrieveFileStream ()
,
Vous devez fermer le InputStream lorsque vous avez fini de lire. Le InputStream lui-même prendra soin de fermer le socket de connexion de données parent lors de sa fermeture.
Lorsque vous fermez le flux, votre connexion client sera également fermée. Donc, au lieu d'utiliser le même client encore et encore, vous devez créer une nouvelle connexion client pour chaque fichier.
Je dois passer des paramètres FTP à la méthode pour créer encore et encore FTPClient. Donc, vous dites que de toute façon je ne peux pas utiliser le même client pour un traitement ultérieur?
veuillez enregistrer le chemin pour que nous puissions voir que le chemin est correct ou non. Je suppose que le flux qui n'est pas correctement fermé pose le problème
Je vais essayer de fermer OutputStream et vérifier si cela fonctionne
Vous devez appeler FTPClient.completePendingCommand
et fermez le flux d'entrée, comme la documentation pour FTPClient.retrieveFileStream
dit:
Renvoie un InputStream à partir duquel un fichier nommé du serveur peut être lu. Si le type de fichier actuel est ASCII, le fichier renvoyé InputStream convertira les séparateurs de ligne du fichier en la représentation locale. Vous devez fermer InputStream lorsque vous finissez de le lire. Le InputStream lui-même prendra en charge fermeture du socket de connexion de données parent lors de sa fermeture.
Pour finaliser le transfert de fichiers, vous devez appeler
completePendingCommand
et vérifiez sa valeur de retour pour vérifier le succès. Si cela n'est pas fait, les commandes suivantes peuvent se comporter de manière inattendue.
inStream = client.retrieveFileStream(path); try { while ((len = inStream.read(buffer)) != -1) { // write bytes from the buffer into output stream os.write(buffer, 0, len); } finalBytes = os.toByteArray(); } finally { inStream.close() if (!client.completePendingCommand()) { // error } }