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

Entrée/Sortie Java Discussion :

Octet, Char, Coding et I/O streams


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut Octet, Char, Coding et I/O streams
    Bonjour tout le monde,
    J'ai une question sur les relations entre octet, Char et I/O :
    J'ai une application qui ne peut lire un fichier qu'en mode binaire : lecture des octets. En effet cette application utilise MappedByteBuffer et du coup elle lit que des octets.

    Mais, le fichier c'est un fichier text, et du coup je converti chaque octet sous form Char avec Casting. quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Char)ByteBuffer.Read(int)
    Dans le 1er temp, j'avais un fichier ascii et du coup chaque Octect = Char. Par conséquent, si je voulais chercher le char dont l'index était 100, je cherchais le 100eme octet. Comme cela, tout marchais bien.

    Mais aujourd'hui, j'ai un fichier text qui a des comportement bizarre. Si je prend un InputStream de ce fichier avec une connexion FTP (réalisé par FTPClient de API apache en Java), chaque octet correspond bien à un char. MAIS, quand je utilise la version originale de ce fichier qui se trouve sur mon disque local, (du coup j'ai un FileInputStream), l'application ne marche pas comme avant. Cela veut dire que chaque octet n'est plus équivalent d'un char.
    Je m'explique : par example avec InputStream et connexion FTP, l'octet 100 est égale à char "A" mais avec un FileInputStream et traitement local du même fichier , l'octet 100 est égale à "F".
    Le problème c'est que la taille de fichier differ quand il est sur le disque du début et quand je le télécharge avec FTPClient de Java.
    Je pensais que peut-etre c'est un fichier unicode (localement) mais sa taille n'est pas 2 fois plus que sa taille un mode FTP.

    Enfin, je suis perdu. Comment je peut savoir combien d'octet sur un fichier correspond à un char? Ou plus précieusement, comment lire des chars d'un fichier en mode binaire (c-a-d en utilisant des bytebuffer et pas des methods propre de lire des fichier text comme des Readers) ?

    Je vous remercie d'avance
    Hassan

  2. #2
    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,


    C'est tout simplement un problème d'encodage : la lecture d'un fichier texte n'est pas aussi simple !


    Tu dois donc spécifier le charset (ou utiliser le charset par défaut) pour effectuer proprement la conversion bytes<->char, ceci via la méthode decode(ByteBuffer)...


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut
    Salut,
    Merci pour la réponse,

    En effet, j'ai pansé à cela, mais je ne sais pas comment je peut savoir l'encodage de fichier de facon automatique sous Java? Comme par exemple, si c'est un fichier ascii, j'ai rien à faire mais si c'est un fichier unicode si....

    D'ailleurs, je viens de trouver la source de problème sur ce fichier. En fait, c'est tout simplement la fin de ligne. (j'en ai assez de ce truc, pourquoi il n'y a pas de un standard pour la fin de ligne indépendant de OS).

    Si je lis le fichier localement, la fin de ligne est deux chars (apparamment \r\n) mais si je le telecharge via FTPClient, la fin de ligne est un seul char (\n).

    Je sais pas comment le gerer lors de conversation des octets. Je veut dire de se rend compte de la fin de ligne et si c'est deux char (\r\n), le remplacer par un seul char(\n)... . ?

    merci encore
    Hassan

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut
    D'ailleurs, si je lis le fichier dans un String, tout est correct, on utilise quel encodage pour creer des variable String.?
    Merci

  5. #5
    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 hassanJava Voir le message
    En effet, j'ai pansé à cela, mais je ne sais pas comment je peut savoir l'encodage de fichier de facon automatique sous Java? Comme par exemple, si c'est un fichier ascii, j'ai rien à faire mais si c'est un fichier unicode si....
    Même avec un fichier ASCII il faudrait spécifier l'encodage... C'est simplement que l'ASCII est généralement inclut dans tous les encodages...

    Tu lis un fichier texte, il faut préciser l'encodage !

    Citation Envoyé par hassanJava Voir le message
    D'ailleurs, je viens de trouver la source de problème sur ce fichier. En fait, c'est tout simplement la fin de ligne. (j'en ai assez de ce truc, pourquoi il n'y a pas de un standard pour la fin de ligne indépendant de OS).
    Bienvenu dans le monde merveilleux de l'informatique


    Citation Envoyé par hassanJava Voir le message
    Si je lis le fichier localement, la fin de ligne est deux chars (apparamment \r\n) mais si je le telecharge via FTPClient, la fin de ligne est un seul char (\n).

    Je sais pas comment le gerer lors de conversation des octets. Je veut dire de se rend compte de la fin de ligne et si c'est deux char (\r\n), le remplacer par un seul char(\n)... . ?
    Quel est ton système d'exploitation !
    la connection FTP devrait convertir cela automatiquement si tu récupère le fichier en mode texte...



    Citation Envoyé par hassanJava Voir le message
    D'ailleurs, si je lis le fichier dans un String, tout est correct, on utilise quel encodage pour creer des variable String.?
    En interne les String sont codé en utf-16...


    a++

Discussions similaires

  1. tous les chars: -*- coding: latin -*-
    Par Luke spywoker dans le forum Général Python
    Réponses: 0
    Dernier message: 01/05/2011, 19h16
  2. Rech code pour lire flux stream camera IP DCS 950 DLink
    Par altair8080 dans le forum Visual C++
    Réponses: 5
    Dernier message: 01/02/2010, 14h57
  3. [Free Pascal] Mini-tutoriel : Différence entre char et chr (auto-analyse de code)
    Par Clandestino dans le forum Free Pascal
    Réponses: 14
    Dernier message: 24/03/2007, 18h18
  4. Réponses: 3
    Dernier message: 08/11/2006, 09h54
  5. Réponses: 4
    Dernier message: 10/04/2006, 22h34

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