2012-10-05 17 views
11

Ho un HashMap con due stringhe Map<String, String> ldapContent = new HashMap<String, String>.Come scrivere e leggere un file con una HashMap?

Ora voglio salvare il Map in un file esterno per utilizzare il Map tardi senza inizializzare di nuovo ...

Così come devo salvare il Map per utilizzarla in seguito di nuovo?

+0

Che cosa hai provato? È possibile utilizzare la serializzazione Java, XML, CSV, dati binari manualmente ... –

+0

Conosco solo il semplice gestore di file. quindi grazie per il consiglio di serializzazione. non lo so prima ... –

risposta

15

HashMap implementa Serializable in modo da poter usare il normale serializzazione di scrivere hashmap archiviare

Ecco il link per Java - Serialization esempio

+0

ok grazie, ci proverò. –

+0

perfetto. Funziona: D grazie mille !!! –

31

La soluzione più semplice che posso pensare è usare la classe Proprietà.

Salvataggio della mappa:

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); 

il caricamento della mappa:

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()); 
} 

EDIT:

se la mappa contiene i valori in chiaro, essi saranno visibili se si dati di file aperti tramite qualsiasi editor di testo, che non è il caso se si serializzare la mappa:

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

EDIT2:

anziché per ciclo (come suggerito da OldCurmudgeon) nell'esempio risparmio:

properties.putAll(ldapContent); 

tuttavia, per l'esempio caricando questo è il meglio che può essere fatta:

ldapContent = new HashMap<Object, Object>(properties); 
+2

Come 'Proprietà' implementa' Mappa' dovresti essere in grado di usare 'putAll' per popolarlo. Inoltre, poiché 'HashMap' ha un HashMap (Map m)' costruttore dovresti essere in grado di popolarlo in costruzione per lo stesso motivo. – OldCurmudgeon

+0

Sono d'accordo, semplifica la soluzione – linski

+0

+1 per il codice di esempio. grazie –

14

dal HashMap interfaccia Serializable, è sufficiente utilizzare la classe ObjectOutputStream per scrivere l'intero Map in file e leggerlo di nuovo utilizzando ObjectInputStream classe

sotto semplice codice che spiegano l'utilizzo di ObjectOutStream e 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(); 
} 

} 

o se si vuole scrivere i dati come testo in un file si può semplicemente scorrere Map e scrivere linea di chiave e valore per riga, e leggerlo di nuovo riga per riga e aggiungere al 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(); 
} 

} 

NOTA: sopra il codice non può essere il modo più veloce per fare questo compito, ma voglio mostrare qualche applicazione delle clas SES

Vedi ObjectOutputStream, ObjectInputStream, HashMap, Serializable, StringTokenizer

+0

+1 per il codice completo per controllare, grazie –

+1

vostro benvenuto @ user1671245, ho cercato di dare esempio completo, e usare alcuni più classi di mostrare modi diversi, spero che ti aiuta – Farnabaz

Problemi correlati