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 :

methode write de (OutStreamWrite,PrintWriter) vs write(Printstream)


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 85
    Par défaut methode write de (OutStreamWrite,PrintWriter) vs write(Printstream)
    Bonjour,
    considérons le petit programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static void main(String[] args) throws IOException {
     
    PrintStream ps = new PrintStream(System.out);
    for (int i = 0; i <= 127; i++) ps.write(i);
     
    OutputStreamWriter ow = new OutputStreamWriter(System.out);
    for (int i = 0; i <= 127; i++) ow.write(i);
    ow.flush();
     
    PrintWriter pw = new PrintWriter(System.out);
    for (int i = 0; i <= 127; i++) pw.write(i);
    pw.flush();
    l'exécution donne la mème sortie:la méthode write(int i) dans les trois classes se comporte de la mème façon quelque soit la classe!!
    par exemple:
    write (33) affiche toujours le caractère "!" ?
    voici mon explication concernant PrintStream:
    write (33) a écrit l'octet 33 dans le stream puis la console a affiché le caractère qui correspond au code ASCII 33.
    par contre je ne trouve pas une explication concernant OutStreamWriter, PrintWriter?
    merci d'avance

  2. #2
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Bonjour,
    l'explication est la même pour les trois: les trois méthodes "write" écrivent le caractère spécifié* qui deviendra le caractère correspondant dans la table d'encoding spécifié.
    A noter que les encoding, eux, peuvent changer, en particulier pour les caractères spéciaux.
    A toi de lire la javadoc de chaque classe pour voir comment

    *évite de parler d'octet, il s'agit ici de caractère: la classe Writer par exemple écrit ses caractères sur 16 bits, soit deux octets. Je n'ai pas regardé chaque classe, encore une fois c'est décrit dans la javadoc.

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

    Citation Envoyé par Jidefix Voir le message
    *évite de parler d'octet, il s'agit ici de caractère:
    Lorsqu'on utilise des Stream on manipule bien des octets, comme indiqué dans la doc d'ailleurs...

    Citation Envoyé par Jidefix Voir le message
    la classe Writer par exemple écrit ses caractères sur 16 bits, soit deux octets. Je n'ai pas regardé chaque classe, encore une fois c'est décrit dans la javadoc.
    Non les Writer écrivent des caractères selon un encodage spécifique, qui dépend de la création du Writer. Selon l'encodage la taille mémoire des caractères peut varier...


    a++

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    A noter que ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrintStream ps = new PrintStream(System.out);
    Est inutile puisque System.out est déjà un PrintStream

  5. #5
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Lorsqu'on utilise des Stream on manipule bien des octets, comme indiqué dans la doc d'ailleurs...
    Je me suis peut-être mal exprimé mais c'était surtout pour faire ressortir l'idée que un "write" n'équivaut pas à écrire un seul octet.

  6. #6
    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 Jidefix Voir le message
    Je me suis peut-être mal exprimé mais c'était surtout pour faire ressortir l'idée que un "write" n'équivaut pas à écrire un seul octet.
    Ca dépend.
    La méthode write() des Stream écrit bel et bien un octet.
    La méthode write() des Writer écrit un caractère, dont la taille peut dépendre à la fois du caractère en question et de l'encodage.

    a++

  7. #7
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ca dépend.
    La méthode write() des Stream écrit bel et bien un octet.
    a++
    J'allais répondre en disant "comment alors représenter les caractères >255"... puis j'ai fais un test en affichant de 0 à 510 et je me suis répondu tout seul :p

    Autant pour moi!

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Jidefix Voir le message
    Autant pour moi!
    Au temps pour toi, pas autant

  9. #9
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Au temps pour toi, pas autant
    http://mawwic.free.fr/blob/index.php...-au-temps-otan

    Duneton le dit c'est un complot!!!
    Vous ne m'aurez pas vivant!!!

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    pour les explications humouristique, je préfère ce site, avec cette perle

    Il faut dire Ostende pour moi. L’expression remonte à 1697, lorsque Louis XIV dut restituer ses conquêtes aux Pays-Bas. Lors des négociations, on lui avait proposé de conserver la ville d’Ostende et il avait refusé car il n’en avait pas compris le sens. Le roi Soleil laissa échapper cette phrase de dépit. Il avait fait la guerre pour rien.
    Mais bon, un peu HS là

  11. #11
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 85
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ca dépend.
    La méthode write() des Writer écrit un caractère, dont la taille peut dépendre à la fois du caractère en question et de l'encodage.

    a++
    Bonjour,
    la question qui se pose pour moi:
    si elle rencontre plus d'un caractère comme : write(33), ici cette méthode trouve le caractère 3 suivie par le caractère 3. que fait cette méthode dans ce cas la?
    merci

  12. #12
    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 SOA_j2EE Voir le message
    si elle rencontre plus d'un caractère comme : write(33), ici cette méthode trouve le caractère 3 suivie par le caractère 3. que fait cette méthode dans ce cas la?
    Non ici tu écris un octet contenant la valeur 33, ce qui correspond au code ASCII du caractère "!".

    Avec write() tu fais du bas niveau et tu travailles au niveau des octets et non pas des caractères. Si tu veux utiliser un formatage plus avancé il faut utiliser les méthode print()...


    a++

  13. #13
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 85
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Non ici tu écris un octet contenant la valeur 33, ce qui correspond au code ASCII du caractère "!".
    a++
    caractére ou octet ? et supposons l'encodage est utf-16?
    la doc dit : write(int c) : Write a single character.

  14. #14
    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
    Ben comme je l'ai déjà dit ca dépend si tu utilises un Stream ou un Writer...

    a++

  15. #15
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 85
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ben comme je l'ai déjà dit ca dépend si tu utilises un Stream ou un Writer...

    a++
    Bien sûr Writer, pas de problème concernant Stream.
    que fait la méthode write de Writer si on lui donne plus d'un caractère comme argument ex: write (33) . ici write de Writer doit convertir le caractère en suite de bits selon l'encodage utilisé; Mais ,dans notre cas, on a deux caractères !!

  16. #16
    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 SOA_j2EE Voir le message
    Mais ,dans notre cas, on a deux caractères !!
    Tu n'as pas deux caractères mais la valeur unicode d'un caractère.

    Donc tu écris UN caractère dont la valeur unicode est 33.


    a++

  17. #17
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Allez je retente pour compléter (oui je suis maso):
    le nombre 33, de type int, qui correspond vaguement avec un caractère, ne doit pas être confondu avec la chaine de caractère "33", qui, elle, fait bien deux caractères.

    Je pense que tu confonds les types:
    int = 4 octets
    byte = 1 octets (gneee)
    String = Ca dépend de ta String ET de ton encoding.

    Le comportement de la classe Writer me semble pas hyper clair mais si je me lançait dans une tentative d'explication je dirai qu'elle fait la chose suivante:
    elle prend ton int: 4 octets
    elle ne garde que les deux octets de bas niveau (The character to be written is contained in the 16 low-order bits of the given integer value; the 16 high-order bits are ignored. )
    elle les écrit.

    Je reste dans la supposition parce que j'ai encore les joues rouges de ce matin (n'empêche, la javadoc n'est pas hyper claire la dessus, notamment dans sa notion de caractère, sauf si elle fait référence au type "char")

  18. #18
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    la doc, sur les writers, de write(int) dit qu'on prend les 16bits les plus bas de l'entier, qu'on en forme un caractère et qu'on envoie ce caractère dans le stream (qui sera alors encodé avec 1 2 ou plus d'octets suivant l'encodage).

    Donc dans ton cas, "en gros", avec utf-16.

    1) la jvm prend le chiffre 33, prend ses 16 bits les plus bas (ca fait toujours 33),
    2) le convertit en un char (le type char), ca fait '!'
    3) et l'envoie vers l'encodeur pour le faire terminer dans ton fichier sous forme de 2 octets utf-16 (ca fait 0x00 0x21)


    On peu juger malheureux l'utilisation d'un int plutot que d'un char qui serait plus rigoureux, mais bon.

  19. #19
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    On peu juger malheureux l'utilisation d'un int plutot que d'un char qui serait plus rigoureux, mais bon.
    Raison pour laquelle on préférera utiliser Writer.append(char) depuis Java 1.5.

    J'imagine que Writer.write(int) remonte aux origines de Java, où un mauvais choix a été fait, et qu'aujourd'hui on doit se le traîner indéfiniment par peur de casser les anciens programmes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    l'idée a l'époque était d'aider les writer écrits nativement qui pouvaient etre plus performant avec ce type de donnée, mais bon, d'accord avec toi, c'est pas judicieux en pratique

Discussions similaires

  1. ant erreur Methode write
    Par totoche dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 03/08/2011, 00h22
  2. PrintStream méthode write
    Par SOA_j2EE dans le forum Général Java
    Réponses: 4
    Dernier message: 18/07/2009, 20h26
  3. Methode write des sockets n'envoie rien
    Par geek-59600 dans le forum Qt
    Réponses: 13
    Dernier message: 17/06/2009, 20h24
  4. Erreur [Incompatible types] avec la Methode Write
    Par aliwassem dans le forum Langage
    Réponses: 6
    Dernier message: 21/12/2008, 05h50
  5. Utilisation du write(), methode ?
    Par gregb34 dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2008, 18h44

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