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 :

Fichier en accès direct


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut Fichier en accès direct
    Bonjour,
    Je suis en train de développer une petite application et je souhaite pouvoir accéder à un enregistrement d'un fichier à travers son numéro.
    Je désire donc utiliser un fichier en accès direct.
    Mais en réfléchissant au problème je me dis qu'en java un chaîne de caractère n'a pas une taille fixe...
    Pour pouvoir me positionner dans mon fichier mes enregistrements doivent avoir une longueur fixe afin de pouvoir faire un positionnement avec une instruction du type
    f.seek( taille_de_ma_classe * numero )

    Pour résoudre ce problème dois-je écrire des méthodes transformant mon objet en un tableau de byte (dont je maîtrise chaque octet) et inversement ?

    Ais-je raté qqch dans mes lectures ?

    Merci pour votre aide.

  2. #2
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608

  3. #3
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    merci pour ce lien mais il ne résout pas mon problème.
    Je désire enregistrer plusieurs Client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Client{
      private long id ;
      private String raisonSociale ;
      private double chiffreAffaire ;
      // D'autres attributs...
     
      // Quelques méthodes...
    }
    A cause du String la taille de l'enregistrement ne sera pas constante...
    Donc je ne sais pas quelle valeur fournir au seek qui veut un offset exprimé en octets depuis le début du fichier.
    Si je désire lire le troisième enregistrement je dois pouvoir me positionner par un seek( taille de Client * 2 ).

  4. #4
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Salut,
    si je ne m abuse la raisonSocial est un code de longeur connue.
    Si oui (meme si non en fait) un tableau de char constant, (de taille du moins, de 128, ou 256 caracteres si besoin) resout le probleme.

  5. #5
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Salut,
    Ta réponse me confirme dans ce que je soupçonnais. Je dois donc prendre en charge la conversion de mon String en tableau de bytes ou de chars dans les deux sens.

    Ceci me fait penser que les fichiers en accès direct ne sont utilsables que dans le cas des types de base. Dans les autres cas il faut prendre soi-même en charge toute la partie de conversion vers un tableau de byte de taille constante...

    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
     
    public class Client{
      private long id ;
      private String raisonSociale ;
      private double chiffreAffaire ;
      // D'autres attributs...
     
      Client( byte[] tab ){
        // découpage de tab, puis conversion et affectation dans les attributs
      }
     
      byte[] getData(){
       // transformation de chaque attribut en tableau de byte et concaténation
      }
     
     
      // Quelques méthodes...
    }
    Il a du boulot...
    Merci de ta réponse

  6. #6
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Voici ce que j'ai mis en oeuvre pour résoudre le problème

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    	// Ecrit une Pers
    	public static void save( RandomAccessFile f, Pers p )throws Exception{
    		f.writeLong( p.getMatricule() ) ;
    		// Génération d'une suite de 30 char. complétés par des espaces à droite
    		f.writeChars( String.format("%-30s",p.getNom()) ) ;
    		f.writeBoolean( p.getMarie() ) ;
    		f.writeDouble( p.getTaille() ) ;
    	}
     
    	// Lit une Pers. Retourne null si EOF
    	public static Pers load( RandomAccessFile f ){
    		Pers p = null ;
    		try{
    			long matricule = f.readLong() ;
    			// Lecture de 30 char
    			char[] chars = new char[30] ;
    			for(int i=0;i<30;i++)
    				chars[i] = f.readChar() ;
    			String nom     = new String(chars);
    			On enlève les espaces inutiles
    			nom = nom.trim() ;
    			boolean marie  = f.readBoolean();
    			Double taille  = f.readDouble();
    			p = new Pers(matricule,nom,marie,taille) ;
    		}
    		catch( Exception e ){
     
    		}
    		return p ;
    	}
     
     
    	public static long getSize(){
                             // long + chaine de 30 + booléen + double
    		return 8 + 2*30 + 1  + 8 ;
    	}
    Puis pour lire un enregistrement on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    		// Lecture de l'enregistrement d'indice 2 ( p3 )
    		// Puis de l'enregistrement d'indice 0 ( p1 ) 
    		f = new RandomAccessFile( "test.dat","r" );
    		f.seek(2*getSize()) ;
    		p = load(f) ;
    		if( p!=null )
    			System.out.println( p ) ;
    		else
    			System.out.println("Enregistrement inexistant.") ;
    Merci pour vos réponses!

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

Discussions similaires

  1. Trier alphabetiquement un fichier a acces direct
    Par rolby65 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/07/2013, 18h50
  2. gestion fichiers en accés direct
    Par gaston11 dans le forum Débuter
    Réponses: 4
    Dernier message: 27/01/2013, 23h11
  3. Fichier en acces direct
    Par DaganaudN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/05/2008, 11h19
  4. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  5. Réponses: 37
    Dernier message: 30/11/2005, 19h41

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