IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Accrochez vous ! erreur de read ftp unix


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut Accrochez vous ! erreur de read ftp unix
    Bonjour à tous !

    L'erreur que j'ai est énorme..
    J'y ai travaillé assez longtemps je pense pour donner ma langue au chat...

    Je lis un fichier sur un serveur UNIX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
           URL monUrl = new URL("ftp://root:xxx@192.168.1.1/home1/monfichier");
           URLConnection flux = monUrl.openConnection();
           InputStream  unFile = flux.getInputStream();
           String charSet = "ISO-8859-2";
           BufferedReader monFileReader;
           monFileReader = new BufferedReader(new InputStreamReader(unFile,charSet));
    C'est un fichier qui contient des enregistrements de 512 octet.
    Je parcours mon fichier avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monFileReader.read(new char[512])
    j'affiche ce que je lis et tout va bien les premiers enregistrements ensuite ça se décale !!!
    Pourtant personne d'autre accede au serveur et aucun processus n'accede au fichier.
    Le pire et ça c'est le pompom c'est que le décalage ne se crée pas toujours au même endroit.

    J'ai éssayé de transferer le fichier d'unix à Windows via le client ftp de windows. J'utilise la méthode classique de java qui permet de lire un fichier en local et là ça marche !!
    Sinon en utilisant fopen et fread de PHP ça marche aussi.

    Si vous comprenez quelque chose ecrivez moi de toute urgence tr ttrrr
    ah c'est dur tr trr

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    que veux-tu dire par décalages ?

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Hmmm... J'imagine que tu ne peux pas lire un flux à partir d'un ftp comme ça à partir d'une URL... Tu dois, en plus des données, recevoir les msgs du protocol FTP qu'il faut traiter (d'où les décalages)...

  4. #4
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Le décalage :

    09916
    09917
    09917
    09918
    09918
    0991
    0991

    je devrais avoir 9919 au lieu de 0991.Donc à un momment donné il lit moins que ce qu'il devrait lire...
    J'ai résolu mon probleme en mettant un Thread.sleep mais je ne vois toujours pas de quoi ca vient ...

    Hmmm... J'imagine que tu ne peux pas lire un flux à partir d'un ftp comme ça à partir d'une URL... Tu dois, en plus des données, recevoir les msgs du protocol FTP qu'il faut traiter (d'où les décalages)...
    Rom --> Alors le décalage devrait avoir lieu au même endroit à chaque relecture complete du fichier

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Pourrait-on avoir plus de détails ? Genre le mode utilisé (Binaire ou ascii), un exemple concret de fichier transféré foireux.

    Si c'est de l'ascii, je soupçonne un remplacement de \n par \r\n inopportun ou inversement. Y'a-t-il des caractères accentués dans le transfert à effectuer ? Le charset ISO-8859-2 est-il justifié ? Si c'est du binaire, est-ce que le buffer est systématiquement et complètement rempli ?

    Enfin, on a de maigres détails, là

  6. #6
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    C'est un fichier cobol indexé.(considere que c'est du ascii)
    Le charset est OK.
    Pour le changement de caractere j'y avais pensé mais, dans ce cas, l'erreur se recréerait au même endroit.
    Et comme je l'ai déjà dit lorsque je transfert le fichier sous windows (sans remplacement de caractere ) la lecture se deroule normalement.
    Je pense que c'est + une question de buffer peut etre. Tu peux m'en dire + sur la manipulation d'un buffer.

    Merci.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Ok, c'est de l'ascii, mais le transfert se fait-il en ascii ? Je ne suis pas un pro de ftp, je l'utilise même rarement, mais je sais que beaucoup d'erreurs sont dues à une utilisation d'ascii en lieu et place de binaire et inversément. Je me dis qu'il y a un mode à définir au transfert.

    Sinon, pour le buffer, le tout est de savoir ce qu'il fait. Puisque c'est du iso-8859-X, tu peux sans crainte exécuter le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    URL monUrl = new URL("ftp://root:xxx@192.168.1.1/home1/monfichier");
    URLConnection flux = monUrl.openConnection();
    InputStream  unFile = flux.getInputStream();
    int len;
    byte[] buf = new byte[512]; // C'est bien 512 la longueur normale d'une ligne ?
    StringBuffer sb = new StringBuffer(512);
    while ((len=unFile.read(buf)) > -1) {
      for (int i = 0; i < len; i++) {
        sb.append((char)buf[i]);
      }
      System.out.print(sb);
      sb.setLength(0);
    }
    Ainsi tu verras octet par octet ce qui se passe dans ta connexion. Et tu pourras voir éventuellement des caractères bizarres, sans pour autant qu'ils soient interprétés par le charset.

    Lorsque le caractère ne te plaît pas, tu peux l'afficher trivialement en hexa.

  8. #8
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    La lecture va planter aléatoirement ce n'est donc pas un caractere qui pose probleme. Et je rapelle qu'avec la fonction fread de php je n'ai pas ce soucis.
    Ce qui est sur c'est que de mettre une tempo resoud mon probleme.

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Et on pourrai voir le code complet que tu utilises pour la lecture ?
    Parce que sinon je ne vois pas comment on pourrait t'aider...

    a++

  10. #10
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Ok mais c'est du classique...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
        static public void LecBofap(String AdresseDuFichier){
            try {
                String charSet = "ISO-8859-2";
                InputStream  unFile = new URL(AdresseDuFichier).openConnection().getInputStream();
                BufferedReader monFileReader = new BufferedReader(new InputStreamReader(unFile,charSet));
                // j'affiche les 5 premiers caracteres car c'est l'info qui m'interesse
                char NB11[] =new char[5];
     
                while (monFileReader.read(NB11) >= 0) {
     
                    monFileReader.skip(507);
                    System.out.println(NB11);
                    try {
                        Thread.sleep(1);
     
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
                monFileReader.close();
                unFile.close();
            } catch (MalformedURLException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    Dans ce cas, cela fonctionne...Par contre, si j'enleve le sleep alors ça se décale aléatoirement...

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Récupère (et affiche) la valeur de retour de la méthode read(), pour être sûr que tu lis bien le bon nombre de caractère...

    Ensuite (mais ce n'est pas à l'origine de ton problème) les fermetures de flux devraient se trouver dans des blocs finally : http://www.developpez.net/forums/sho...04#post1170704

    a++

  12. #12
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Pour la methode read j'ai toujours 5 donc c'est bon.
    Par contre, j'ai changé la methode skip(507) par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.err.println(monFileReader.read(new char[507]));
    Et là c'est le drame --> je lis bien les 507 plusieurs fois et d'un coup je tombe à 152 !!

    Ca explique bien le fait que j'ai un décalage mais pas pourquoi j'ai une chute de lecture dans le flux.

    Bien sur cela reste aléatoire.
    Yaurait il un moyen de continuer ma boucle à condition que j'ai bien lu mes 512 octets ?

  13. #13
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jeffciara
    Et là c'est le drame --> je lis bien les 507 plusieurs fois et d'un coup je tombe à 152 !!
    Au milieu du traitement ou à la fin ? Si c'est à la fin c'est normal cela signifie que tu as atteint la fin du fichier...


    Sinon d'après la doc de InputStream il est possible que skip() retourne plus tôt : il faut vérifier son code de retour


    a++

  14. #14
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Aleatoirement.
    Donc au milieu , vers le début, vers la fin...

    En ce qui concerne la methode skip(long) je pense son job est de faire un read(new char[long])

  15. #15
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Il s'agit surement de lenteur réseaux, qui font que le buffer de lecture est vide et que le skip() ne bloque pas. Le problème vient surement de l'implémentation de l'InputStream qui gère le FTP...


    Il faut donc que tu vérifies la valeur retourné par le read() et par le skip(), par exemple en le remplaçant par cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public static void skip(Reader r, long n) throws IOException {
     
    		long skipped;
    		while (n>0) {
    			skipped = r.skip(n);
    			if (skipped<=0) {
    				break; // EOF
    			}
    			n -= skipped;
    		}
     
    	}
    a++

  16. #16
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    S'il n'existe pas d'autre façon je pense que je vais adopter ta solution qui est quand même plus élegante qu'un sleep et plus sure

    Merci pour ton aide

  17. #17
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Bah oui, faut toujours vérifier la longueur du message lu. On ne sait jamais ce que TCP nous renvoie de manière sous-jacente.

  18. #18
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Bah c sure que c logique bah voyons

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    C'est écrit dans la Javadoc...

  20. #20
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    si c'est ecrit dans la bible alors...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Transfert FTP Unix
    Par AAWOOPY56 dans le forum Unix
    Réponses: 3
    Dernier message: 17/11/2009, 16h00
  2. Transfert ftp Unix
    Par AAWOOPY56 dans le forum Unix
    Réponses: 4
    Dernier message: 30/07/2009, 11h09
  3. Erreur class.image.config.unix & class.image.interface
    Par pucenet dans le forum Langage
    Réponses: 2
    Dernier message: 18/06/2008, 06h32
  4. comment transférer un fichier d'un serveur ftp unix vers un client ftp dos ?
    Par chercheur3 dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 21/06/2007, 10h47
  5. Différence entre ftp Windows et ftp unix
    Par diamonds dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 07/12/2006, 20h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo