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 :

java.nio : utilisation des Channel


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Par défaut java.nio : utilisation des Channel
    Bonjour,

    Dans le but d'optimiser l'écriture dans les fichiers, je peux utiliser le package java.nio.
    J'ai donc développé la petite fonction suivante, mais qui ne fonctionne pas ; je ne comprends pas pourquoi.
    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
        public static void write() throws IOException
        {
            File file = new File("C:/temp/test.txt");
            file.createNewFile();
            FileOutputStream fos = new FileOutputStream(file);
            String st = "tata\n yoyo";
            FileChannel channel = fos.getChannel();
            ByteBuffer bb = ByteBuffer.allocate(st.length() * 2); 
            // CAUTION: allocated size is nb_chars x size of a char (in bytes)
            for (int i = 0; i < st.length(); i++)
            {
                bb.putChar(st.charAt(i));
            }
            bb.flip();
            channel.write(bb);
            fos.close();
        }
    Une idée sur la raison pour laquelle mon fichier reste vide ?

  2. #2
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Bonjour,

    c'est le channel qu'il faut fermer, pas le FileOutputStream


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Par défaut
    J'avais bien essayé, sans succès...
    J'ai juste un retour chariot dans mon fichier test.txt

  4. #4
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    ????
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    java.io.File file = new java.io.File("C:/test.txt");
    file.createNewFile();
    java.io.FileOutputStream fos = new java.io.FileOutputStream(file);
    String st = "tata\n yoyo";
    java.nio.channels.FileChannel channel = fos.getChannel();
    java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(st.length() * 2); 
    // CAUTION: allocated size is nb_chars x size of a char (in bytes)
    for (int i = 0; i < st.length(); i++)
    {
        bb.putChar(st.charAt(i));
    }
    bb.flip();
    channel.write(bb);
    channel.close();
    j'obtiens dans le fichier test.txt

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Par défaut
    Bigre ! (si je puis me permettre )

    En fait, j'ouvrais mon fichier avec Crimson Editor, qui ne m'affichait rien.
    En changeant l'encodage du document (de ASCII à Unicode), je vois le message apparaître....
    Une idée du pourquoi ?

  6. #6
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Citation Envoyé par jan0
    Qu'est ce qui peut être à l'origine de ce problème ? l'OS (Windows XP pour moi) ?
    pas mieux ! (enfin, je veux dire que j'ai XP aussi, et non pas qu'il n'y a pas mieux que XP )

    par contre c'est le channel que je ferme

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

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par jan0
    Bigre ! (si je puis me permettre )

    En fait, j'ouvrais mon fichier avec Crimson Editor, qui ne m'affichait rien.
    En changeant l'encodage du document (de ASCII à Unicode), je vois le message apparaître....
    Une idée du pourquoi ?
    Les caractères sont de String sont des "char" ( unicode, codés sur deux octets). Tu transferts la chaine dans un buffer d'octet, c'est donc normal.En affichage ascii ( UTF8 sur 1 octet ), le premier octet ( de l'unicode ) est interprété comme un espace, le deuxième octet est le caractère. Tu te retrouves donc avec un espace entre chaque caractère.
    En espérant avoir été clair... La seul chose qu'il faille retenir est qu'un "char" fait deux octets alors qu'en UTF8, il n'en fait qu'un.
    Pour contourner ce problème ( tu utilises nio, c'est très bien ), tu as le package nio.charset qui te permet d'encoder/décoder dans le format que tu veux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser des Objets PHP en Java
    Par nako dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 09/05/2007, 14h05
  2. Réponses: 4
    Dernier message: 24/04/2007, 18h05
  3. Comment utiliser des sources en fortran90 sous JAVA?
    Par dante66 dans le forum Général Java
    Réponses: 6
    Dernier message: 21/02/2007, 15h25
  4. [reseau ] java.nio.channels
    Par AMARI_SALIM dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 10/04/2006, 22h43
  5. Réponses: 3
    Dernier message: 22/11/2005, 19h23

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