2012-10-05 81 views
11

Tengo un HashMap con dos cuerdas Map<String, String> ldapContent = new HashMap<String, String>.¿Cómo escribir y leer un archivo con un HashMap?

Ahora desea guardar el Map en un archivo externo para utilizar la Map tarde sin inicializar de nuevo ...

Entonces, ¿cómo debo guardar el Map usarlo más tarde otra vez?

+0

¿Qué has intentado? Puede usar la serialización de Java, XML, CSV, datos binarios manualmente ... –

+0

solo conozco el lector de archivos simple. por lo tanto, gracias por la sugerencia de serialización. No lo sé antes ... –

Respuesta

15

HashMap implementa Serializable para que pueda utilizar la serialización normal a escribir HashMap para presentar

Aquí está el enlace para Java - Serialization ejemplo

+0

ok gracias, lo intentaré. –

+0

perfecto. funciona: D muchas gracias! –

31

La solución más simple que se me ocurre es usar clase de propiedades.

Salvar el mapa:

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

Cargando el mapa:

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:

si su mapa contiene valores de texto sin formato, que será visible si los datos de archivos abiertos a través de cualquier editor de texto, que no es el caso si serializas el mapa:

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

Edit2:

en lugar de bucle (como se sugiere en OldCurmudgeon) en el ejemplo de ahorro: sin embargo

properties.putAll(ldapContent); 

, para el ejemplo de carga que esto es lo mejor que se puede hacer:

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

Como 'Properties' implementa' Map' deberías poder usar 'putAll' para poblarlo. Además, como 'HashMap' tiene un constructor' HashMap (Map m) ', deberías poder poblarlo en la construcción por la misma razón. – OldCurmudgeon

+0

Acepto, simplifica la solución – linski

+0

+1 para la muestra del código. gracias –

14

desde HashMap implementa la interfaz Serializable, puede simplemente usar la clase ObjectOutputStream para escribir Map enteros en el archivo, y leer de nuevo con ObjectInputStream clase

continuación código simple que explican el uso de ObjectOutStream y 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 si desea escribir los datos en forma de texto para presentar simplemente puede iterar a través de Map y escribir clave y el valor de la línea por línea, y leer de nuevo línea por línea y añadir a 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: el código anterior puede no ser la manera más rápida de hacer esta tarea, pero quiero mostrar algo de aplicación de clas ses

Ver ObjectOutputStream, ObjectInputStream, HashMap, Serializable, StringTokenizer

+0

+1 para ver el código completo, gracias –

+1

su bienvenida @ user1671245, traté de dar un ejemplo completo, y usar algunas clases más para mostrar diferentes formas, espero que lo ayude – Farnabaz

Cuestiones relacionadas