2015-05-17 82 views
0

我必須將一些信息保存到硬盤然後加載它。 要保存的信息,我做的事:myMap.toString - >寫入文件名將字符串轉換爲散列圖

然後我從盤面看:

String myFutureMap = read filename. 
HashMap<Integer, MyData> = convertFromString(myFutureMap) 

class MyData{ 
    public int sumaTiCuadrado; 
    public int n; 
    public int TTotal; 
} 

我怎麼能轉換成字符串HashMap的回來?

+1

什麼'myFutureMap'的價值?你能舉一個例子嗎?更容易找到如何將其轉換爲所需的'HashMap'的方法。謝謝:) – QueryLars

+0

他使用'Map.toString()',所以格式在[AbstractMap'的JavaDocs]中描述(http://docs.oracle.com/javase/7/docs/api/java/ UTIL/AbstractMap.html#的toString())。 –

+0

@MickMnemonic,但只解釋了'{key = value,key = value}'結構,我們仍然不知道'MyData'是否有'toString'方法和它產生的輸出。我們也不知道是否有'value'部分代表內部結構如內部結構'{foo = bar}',或列出'[foo,bar]'的情況。 – Pshemo

回答

0

使用toString()是不是最好的選擇 - 你toString()實現應出示適當的字符串描述的結構和類型的嵌入式元素 - 簡單,你必須寫全系列化邏輯等

更好的選擇是使用一些現有的序列化機制:

Java Ser ialisation

private Object convertFromBytes(byte[] value) throws IOException, ClassNotFoundException { 
    try (InputStream is = new ByteArrayInputStream(value); 
     ObjectInputStream ois = new ObjectInputStream(is)) { 
     return ois.readObject(); 
    } 
} 

private byte[] convertToBytes(Object object) throws IOException { 
    try (ByteArrayOutputStream os = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(os)) { 
     oos.writeObject(object); 
     oos.flush(); 
     return os.toByteArray(); 
    } 
} 

GSON系列化

private <T> T convertFromString(String value, Class<T> type) { 
    Gson gson = new Gson(); 
    return gson.fromJson(value, type); 
} 

private String convertToString(Object object) throws IOException { 
    Gson gson = new Gson(); 
    return gson.toJson(object); 
} 
1

它序列化到JSON,使用GSON庫:https://code.google.com/p/google-gson/

這裏是一個很好的教程:http://www.java2blog.com/2013/11/gson-example-read-and-write-json.html

編輯:

請重寫你的類,它解壓到一個單獨的文件,它會再滿足Java約定和封裝:

public class MyData { 
    private int sumaTiCuadrado; 

    private int n; 

    private int tTotal; 

    public MyData(int sumaTiCuadrado, int n, int tTotal) { 
     this.sumaTiCuadrado = sumaTiCuadrado; 
     this.n = n; 
     tTotal = tTotal; 
    } 

    public int getN() { 
     return n; 
    } 

    public int getSumaTiCuadrado() { 
     return sumaTiCuadrado; 
    } 

    public int getTTotal() { 
     return tTotal; 
    } 
} 

這裏是一個util類適合你:

public class JsonSerializationUtil { 

private static Gson gson = new GsonBuilder().setPrettyPrinting().create(); 

public static void serialize(String path, Object objectToSerialize) { 
    String jsonString = gson.toJson(objectToSerialize); 
    BufferedWriter bufferedWriter = null; 
    try { 
     bufferedWriter = new BufferedWriter(new FileWriter(path)); 
     bufferedWriter.write(jsonString); 
     bufferedWriter.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public static Map<Integer, MyData> deserialize(String path) { 
    BufferedReader bufferedReader = null; 
    Map<Integer, MyData> result = null; 
    String line = ""; 
    StringBuilder completeStringFromFile = new StringBuilder(); 
    try { 
     bufferedReader = new BufferedReader(new FileReader(path)); 
     while ((line = bufferedReader.readLine()) != null) { 
      completeStringFromFile.append(line); 
     } 
     bufferedReader.close(); 
     Type type = new TypeToken<Map<Integer, MyData>>() { 
     }.getType(); 
     result = gson.fromJson(completeStringFromFile.toString(), type); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return result; 
} 

} 

和示例:

public static void main(String[] args) { 
    Map<Integer, MyData> map = new HashMap<Integer, MyData>(); 
    map.put(1, new MyData(1, 1, 1)); 
    map.put(2, new MyData(2, 2, 2)); 
    serialize("myMap.json", map); 

    Map<Integer, MyData> newMap = deserialize("myMap.json"); 
    for (Map.Entry<Integer, MyData> mapEntry : newMap.entrySet()) { 
     System.out.println(mapEntry.getKey() + " " + mapEntry.getValue().getN()); 
    } 
} 
+0

從那裏看不到任何有用的東西 –

+0

我編輯了我的答案。 – Tomek

+0

謝謝,我想它的工作原理雖然我不能使用外部圖書館這個「joc」 –

相關問題