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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    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 éprouvé
    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
    Points : 935
    Points
    935
    Par défaut
    Bonjour,

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


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

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

  4. #4
    Membre éprouvé
    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
    Points : 935
    Points
    935
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    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 éprouvé
    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
    Points : 935
    Points
    935
    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 chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    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.

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

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Citation Envoyé par fnobb
    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
    Je répète :
    "char" en java = 2 octets.
    UTF8 ( par défaut sous windaube ) = 1 octet.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    La solution, au final:
    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
            // Create the encoder and decoder for ISO-8859-1
            Charset charset = Charset.forName("ISO-8859-1");
            CharsetEncoder encoder = charset.newEncoder();
     
            File file = new File("C:/temp/test.txt");
            file.createNewFile();
            OutputStream fos = new FileOutputStream(file);
            String st = "tata\n yoyo";
            WritableByteChannel channel = Channels.newChannel(fos);
            ByteBuffer bb = encoder.encode(CharBuffer.wrap(st));
    // CAUTION: THE BUFFER MUST NOT BE FLIPPED ANYMORE.
    //        bb.flip();
            channel.write(bb);
            channel.close();
            fos.close();
    J'attire quand même votre attention sur le fait qu'il n'est plus nécessaire de (et même qu'il est nécessaire de NE PAS) faire un "flip()" du buffer.

  10. #10
    Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2016
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    bonjour Tm;
    j'ai essai le même exemple sur les type int et Float est ça marche pas!!!!!!!!!!!!!!!!!!!!!
    c'est-à-dire que je veut crée un chanel qui écrire mes données de programme sur un fichier .txt
    merci our votre aide ;;;;;;;;;;;;;;;;;;;;;;;;;;

+ 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