web-dev-qa-db-fra.com

Comment écrire et lire un fichier avec un HashMap?

J'ai un HashMap avec deux chaînes Map<String, String> ldapContent = new HashMap<String, String>.

Maintenant, je veux enregistrer le Map dans un fichier externe pour utiliser le Map plus tard sans l'initialiser à nouveau ...

Alors, comment dois-je enregistrer le Map pour l'utiliser à nouveau plus tard?

14
user1671245

HashMap implémente Serializable afin que vous puissiez utiliser la sérialisation normale pour écrire une table de hachage dans un fichier

Voici le lien pour Java - Sérialisation exemple

16
Amit Deshpande

La solution la plus simple à laquelle je peux penser est d'utiliser la classe Properties.

Sauvegarde de la carte:

Map<String, String> ldapContent = new HashMap<String, String>();
Properties properties = new Properties();

for (Map.Entry<String,String> entry : ldapContent.entrySet()) {
    properties.put(entry.getKey(), entry.getValue());
}

properties.store(new FileOutputStream("data.properties"), null);

Chargement de la carte:

Map<String, String> ldapContent = new HashMap<String, String>();
Properties properties = new Properties();
properties.load(new FileInputStream("data.properties"));

for (String key : properties.stringPropertyNames()) {
   ldapContent.put(key, properties.get(key).toString());
}

ÉDITER:

si votre carte contient des valeurs en texte brut, elles seront visibles si vous ouvrez des données de fichier via un éditeur de texte, ce qui n'est pas le cas si vous sérialisez la carte:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.ser"));
out.writeObject(ldapContent);
out.close();

EDIT2:

au lieu de la boucle for (comme suggéré par OldCurmudgeon) dans l'exemple d'enregistrement:

properties.putAll(ldapContent);

cependant, pour l'exemple de chargement, c'est le mieux qui puisse être fait:

ldapContent = new HashMap<Object, Object>(properties);
36
linski

étant donné que HashMap implémente l'interface Serializable, vous pouvez simplement utiliser la classe ObjectOutputStream pour écrire l'ensemble Map dans un fichier et le relire à l'aide de ObjectInputStream classe

ci-dessous un code simple qui explique l'utilisation de ObjectOutStream et ObjectInputStream

import Java.util.*;
import Java.io.*;
public class A{

    HashMap<String,String> hm;
    public A(){
        hm=new HashMap<String,String>();

        hm.put("1","A");
        hm.put("2","B");
        hm.put("3","C");

        method1(hm);

    }

public void method1(HashMap<String,String> map){
    //write to file : "fileone"
    try{
    File fileOne=new File("fileone");
    FileOutputStream fos=new FileOutputStream(fileOne);
        ObjectOutputStream oos=new ObjectOutputStream(fos);

        oos.writeObject(map);
        oos.flush();
        oos.close();
        fos.close();
    }catch(Exception e){}

    //read from file 
    try{
        File toRead=new File("fileone");
        FileInputStream fis=new FileInputStream(toRead);
        ObjectInputStream ois=new ObjectInputStream(fis);

        HashMap<String,String> mapInFile=(HashMap<String,String>)ois.readObject();

        ois.close();
        fis.close();
        //print All data in MAP
        for(Map.Entry<String,String> m :mapInFile.entrySet()){
            System.out.println(m.getKey()+" : "+m.getValue());
        }
    }catch(Exception e){}
  }

public static void main(String args[]){
        new A();
}

}

ou si vous voulez écrire des données sous forme de texte dans un fichier, vous pouvez simplement parcourir Map et écrire la clé et la valeur ligne par ligne, et la relire ligne par ligne et ajouter à HashMap

import Java.util.*;
import Java.io.*;
public class A{

    HashMap<String,String> hm;
    public A(){
        hm=new HashMap<String,String>();

        hm.put("1","A");
        hm.put("2","B");
        hm.put("3","C");

        method2(hm);

    }

public void method2(HashMap<String,String> map){
    //write to file : "fileone"
    try{
    File fileTwo=new File("filetwo.txt");
    FileOutputStream fos=new FileOutputStream(fileTwo);
        PrintWriter pw=new PrintWriter(fos);

        for(Map.Entry<String,String> m :map.entrySet()){
            pw.println(m.getKey()+"="+m.getValue());
        }

        pw.flush();
        pw.close();
        fos.close();
    }catch(Exception e){}

    //read from file 
    try{
        File toRead=new File("filetwo.txt");
        FileInputStream fis=new FileInputStream(toRead);

        Scanner sc=new Scanner(fis);

        HashMap<String,String> mapInFile=new HashMap<String,String>();

        //read data from file line by line:
        String currentLine;
        while(sc.hasNextLine()){
            currentLine=sc.nextLine();
            //now tokenize the currentLine:
            StringTokenizer st=new StringTokenizer(currentLine,"=",false);
            //put tokens ot currentLine in map
            mapInFile.put(st.nextToken(),st.nextToken());
        }
        fis.close();

        //print All data in MAP
        for(Map.Entry<String,String> m :mapInFile.entrySet()){
            System.out.println(m.getKey()+" : "+m.getValue());
        }
    }catch(Exception e){}
  }

public static void main(String args[]){
        new A();
}

}

REMARQUE: le code ci-dessus n'est peut-être pas le moyen le plus rapide de faire cette tâche, mais je veux montrer une application des classes

Voir ObjectOutputStream , ObjectInputStream , HashMap , Serializable , StringTokenizer

18
Farnabaz

Vous pouvez écrire un objet dans un fichier à l'aide de writeObject dans ObjectOutputStream

ObjectOutputStream

2
arutaku