2012-10-05 19 views
11

Mam HashMap z dwoma ciągami Map<String, String> ldapContent = new HashMap<String, String>.Jak napisać i przeczytać plik z HashMap?

Teraz chcę zapisać Map w zewnętrznym pliku użyć Map później bez inicjowanie go ponownie ...

Więc jak muszę zapisać Map go użyć później ponownie?

+0

Co próbowałeś? Możesz używać serializacji Java, XML, CSV, danych binarnych ręcznie ... –

+0

Po prostu znam prosty filereader. dlatego też dziękuję za wskazówkę do serializacji. Nie wiem tego wcześniej ... –

Odpowiedz

15

HashMap realizuje Serializable więc można użyć normalnego serializacji napisać hashmap złożyć

Oto link do Java - Serialization przykład

+0

ok dzięki, spróbuję. –

+0

perfect. to działa: D, dziękuję bardzo !!! –

31

Najprostszym rozwiązaniem, które mogę wymyślić jest użycie klasy Właściwości.

Zapisywanie mapę:

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

Wkładanie mapę:

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:

jeśli mapa zawiera wartości zwykłego tekstu, będą widoczne, jeśli otwarte dane pliku za pomocą dowolnego edytor tekstu, co nie ma miejsca w przypadku serializacji mapy:

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

EDIT2:

zamiast do pętli (jako sugerowane przez OldCurmudgeon) w ratowaniu przykład:

properties.putAll(ldapContent); 

jednak, dla przykładu ładunkowej jest to najlepsze, co można zrobić:

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

Ponieważ 'Właściwości' implementuje' Mapę', powinieneś być w stanie użyć 'putAll', aby zapełnić. Ponadto, ponieważ 'HashMap' ma konstruktor' HashMap (Map m) ', powinieneś być w stanie wypełnić go na budowie z tego samego powodu. – OldCurmudgeon

+0

Zgadzam się, to upraszcza rozwiązanie – linski

+0

+1 dla próbki kodu. dzięki –

14

od HashMap implementuje interfejs Serializable, można po prostu użyć klasy ObjectOutputStream, aby napisać cały plik Map do pliku, i przeczytać go ponownie za pomocą ObjectInputStream klasa

poniżej prostego kodu, który wyjaśni użycie ObjectOutStream i 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(); 
} 

} 

lub jeśli chcesz zapisać dane jako tekst do pliku może po prostu iterację Map i zapisu klucza i wartości linia po linii, a ją ponownie przeczytać wiersz po wierszu i dodać do 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(); 
} 

} 

UWAGA: powyższy kod nie może być najszybszym sposobem wykonywania tego zadania, ale chcę pokazać trochę stosowania clas ses

Zobacz ObjectOutputStream, ObjectInputStream, HashMap, Serializable, StringTokenizer

+0

+1 za pełny kod do sprawdzenia, dziękuję –

+1

powitanie @ user1671245, starałem się dać pełny przykład, i użyć więcej klas, aby pokazać różne sposoby, mam nadzieję, że to pomaga – Farnabaz

Powiązane problemy