1
votes

Lecture de plusieurs fichiers en boucle à partir d'un serveur FTP à l'aide d'Apache Commons Net FTPClient

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 ?


0 commentaires

3 Réponses :


1
votes

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.


1 commentaires

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?



-1
votes
  1. Je n'ai pas vu que le flux de sortie n'est pas correctement fermé.
  2. finalBytes vaut o octets?
  3. où vous avez défini la variable de tampon?

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


1 commentaires

Je vais essayer de fermer OutputStream et vérifier si cela fonctionne



0
votes

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
    }
}


0 commentaires