Fichier binaire en java

Signaler
Messages postés
9
Date d'inscription
lundi 21 mai 2012
Statut
Membre
Dernière intervention
16 septembre 2012
-
Messages postés
9
Date d'inscription
lundi 21 mai 2012
Statut
Membre
Dernière intervention
16 septembre 2012
-
Bonjour, ma question est :
j'utilise le langage java, j'ai des tables HashMap à stocker dans des fichiers binaires et les recuperer plutard, j'ai essayer de le réaliser avec l'exemple suivant:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author FATARE
*/
public class Exemplewtable {
public static void main (String args[]) throws FileNotFoundException, IOException{
File fichier2= new File("fichier1");
FileOutputStream sortie = new FileOutputStream(fichier2);
DataOutputStream eregistrement1 ;

eregistrement1 = new DataOutputStream(new BufferedOutputStream(sortie));

FileInputStream entree = new FileInputStream(fichier2);
DataInputStream auteur1;
auteur1 = new DataInputStream(new BufferedInputStream(entree));

HashMap <String,Integer> table = new HashMap<String,Integer> ();

table.put("jght",44);
table.put("tftght",443);
table.put("htft",4435);
for (Map.Entry<String,Integer> entre: table.entrySet()){

eregistrement1.writeUTF(entre.getKey());

eregistrement1.writeInt(entre.getValue());




}eregistrement1.close();
try

{

System.out.println("auteur1 "+ auteur1.readUTF());

System.out.println( "auteur1 "+ auteur1.readInt());

auteur1.close();

}
catch (IOException t)
{
}

}}

l'exécution de ce pg me donne :

run:
auteur1 jght
auteur1 44
BUILD SUCCESSFUL (total time: 3 seconds).




mon but et de stocker ces table et pouvoir acceder à leurs contenu à partir d'un autre programme,par exemple dans un programme je teste si un string (abc) se trouve dans cette table si oui retourner sa valeur.merci d'avance.je voudrais au moins des indices .

11 réponses

Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
Salut,

je ne comprends pas...
tu as un code qui semble fonctionner et tu dis qu'il y a un problème???

Salut,

Où est ton problème exactement ?

--
Pylouq
(Lire le Réglement n'a jamais tué personne, au pire ça a instruit des gens.)
Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
110
Salut,

Si ton autre application est également en java et qu'elle peut lire des fichiers sérialisés... pourquoi ne pas simplement utiliser la sérialisation et du coups tu auras moins de tracas...

-----

"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO

J'avoue que de cette façon c'est plus simple. Il va juste falloir bien lire ton fichier en lisant les objets sérializés dans le même ordre qu'ils ont été mis dans le fichier.


--
Pylouq
(Lire le Réglement n'a jamais tué personne, au pire ça a instruit des gens.)
Messages postés
9
Date d'inscription
lundi 21 mai 2012
Statut
Membre
Dernière intervention
16 septembre 2012

salut, on a déja utilisé cette methode que vous venez de nous proposez (sérialisation) mais on s'est trompé au niveau de la lecture, maintenant on a crée deux classes et il n ya pas de problème (grâce à vous).on a deux autres quéstions:

1.quand on ouvre le fichier avec bloc-note on trouve des boux qu'on peux lire,est ce que ça ne doit pas être des suites des 0 et 1?

2.les données qu'on a rangé dans ces tables doivent être directement écrites dans des fichiers binaires, faute de temps on a pensé à les ranger dans des tables puis les stocker dans ces fichiers binaires, est ce qu'il a un moyen de stocker ces données dans le fichier sans garder la structure de la table et pouvoir les recuperer et les manipuler dans un autre pg sans soucis(si comme s'elles été criées dans le mm pg)?une méthode plus optimale qui nous permet de gagner plus de temps (celui de l'accés à ces tables aprés les avoir recupérer).merci beaucoup
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
concernant le point 1,

non, lorsque tu ouvres un fichier avec le bloc note, il ne va pas te montrer juste des 1 et des 0... le programme va lire ton fichier octet par octet, autrement dit caractère par caractère et afficher le caractère représenter par cet octet...

pour le deuxieme point, j'ai compris que vous triez le tableau avant de l'écrire dans le fichier... et tu aimerais savoir s'il est possible d'écrire le tableau sans tenir compte de ce tri....
c'est ça?
Messages postés
9
Date d'inscription
lundi 21 mai 2012
Statut
Membre
Dernière intervention
16 septembre 2012

merci pour votre intervention
bon , pour le point1 je vais vous montrer les deux classes et ce que j'ai trouvé dans le fichier et vous me dites si c'est ordinaire.




pour le point 2: je ne veux pas trier un tableau, je vais vous donner un petit exemple sur mon application et vous allez comprendre:

j'ai une collection de documents parlant de java, je vais extraire document par document et dans chaque document je parcours ligne par ligne pour extraire les termes qui vont représenter chaque document (sans prendre en compte les mots vides: les articles ,les [color=red]propositions ...etc car ils ne pouvent pas représenter un document du fait qu'ils existent dans tous les documents
Normalement à chaque fois que j'extrais un terme je dois lesauvgarder dans un fichier binaire est compris la taille chaque document et toutes les informations necessaires, mais on a compris tard que je dois proceder ainsi, j'ai stocké ces données dans des tables HashMap puis dans des fichiers binaires.
Quand vous saisissez la requête: [le langage de programmation java] moi je dois acceder à ces fichiers pour comparer les terme: langage, programmation et java aux termes présents dans ces fichiers pour vous renvoyer les resultats (documents ) que vous cherchez

en résumé le stockage dans des fichiers binaires est meilleur à celui dans des Bases de Données,ce doit être la conclusion de notre travail,

Je m'excuse de vous avoir encombrer l'esprit , la serialisation permet de recuperer les tables donc je vais perdre un peu de temps quand je vais acceder à la table (je veux recupere directement les données et faire la comparaison avec la requête).merci encore une fois.
Messages postés
9
Date d'inscription
lundi 21 mai 2012
Statut
Membre
Dernière intervention
16 septembre 2012

voici la 1ere classe que j'ai crée dans projet 'un' (netbeans):

package un;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.HashMap;

/**
*
* @author FATARE
*/
public class Sms {





public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException
{


// Création
File fichier = new File("lefichier");

HashMap<String,Integer> map1 = new HashMap<String,Integer> ();
map1.put("Tata",123);
map1.put("Titi",456);
map1.put("Toto",789);

// Sérialisation

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fichier));
out.writeObject(map1);
out.close();


}



}


voici la 2em classe:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package un;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

/**
*
* @author FATARE
*/
public class NewClass1 {
public static void main(String[] args) throws IOException, ClassNotFoundException{


Vector<String> query_vect= new Vector<String>();

query_vect.add("toto");
String terme;
for(int i=0;i<query_vect.size();i++){
terme= (String)query_vect.get(i);
// Désérialisation

File fichier = new File ("lefichier");
ObjectInputStream in = new ObjectInputStream(new FileInputStream( fichier));
HashMap<String,Integer> map2 = (HashMap<String, Integer>) in.readObject();
in.close();


// Affichage

for (Map.Entry<String, Integer> e : map2.entrySet())
System.out.printf("%s\t%d\n",e.getKey(),e.getValue());
}




}


}





voici ce que je trouve dans le fichier'' si je l'ouvre avec bloc note:

¬í sr java.util.HashMapÚÁÃ`Ñ F
loadFactorI thresholdxp?@ w  t Totosr java.lang.Integerâ ¤÷‡8 I valuexr java.lang.Number†¬• ”à‹ xp t Titisq ~  Èt Tatasq ~  {x

Du coup, si tu ne veux pas sérializer tes Hashtables directement dans tes fichiers, pourquoi ne pas enregistrer juste ce qu'elles contiennent ? Par exemple si tu as une Hashtable<String, Long>, pourquoi ne pas parcourir cette table et écrire dans le fichier chaque String et chaque Long les uns à la suite des autres ? Si j'ai pas saisis quelque chose à tes explications, dis-le^^

Pour ce qui est de ton fichier, je le trouve un peu curieux. Si tu veux, quand tu écrits quelque chose dans un fichier, tu as deux possibilités. Soit tu écrits en mode texte, ce qui te permet de voir "lisiblement" le contenu de ton fichier, soit tu écris en binaire, comme c'est le cas. L'avantage du binaire, c'est que les accès en lecture sont bien plus rapides qu'avec l'autre mode. Par exemple, si tu as un Integer dans un fichier binaire, tu as des méthodes toutes prêtes faites qui vont lire le nombre d'octets nécessaires pour te renvoyer un Integer. Si jamais tu avais mis cette valeur entière en mode texte, ça aurait été à toi de lire caractère par caractère, ce qui est nettement moins optimisé. Lorsque tu ouvres un fichier binaire, tu te retrouves souvent face à une petite bouillie de tout. Le plus souvent, c'est l'éditeur que tu utilises qui essaye de traduire tout ça. Parfois ça marche, parfois c'est incompréhensible.

Tu vas juste pouvoir modifier ton main pour vérifier un truc ? Car justmeent, avec ce que je peux lire, je me demande si tu t'es pas pris un exception du genre NumberFormatException. Corrige ton main comme ci dessous, c'est plus propre :

public static void main( String [] args ){

   try {
      // ton code dans ton main précédent
   } catch (Exception e){
      e.printStackTrace();
   }

}


--
Pylouq
(Lire le Réglement n'a jamais tué personne, au pire ça a instruit des gens.)

Alors, où en es-tu dans la résolution de ton problème ?


--
Pylouq
(Lire le Réglement n'a jamais tué personne, au pire ça a instruit des gens.)
Messages postés
9
Date d'inscription
lundi 21 mai 2012
Statut
Membre
Dernière intervention
16 septembre 2012

bonjour, j'ai ajouté le bloc try catch mais ça change rien le contenu du fichier reste le même.
dans le premier code que j'ai posté j'ai essayé de sauvgarder les elements sans la table,bon c'est juste un exemple et le problème c'est qu'il sauvgarde que la dérnière valeur.
je pense qu'à présent j'ai pas le choix j'utilise la sérialisation