Je veux lire une valeur particulière de LinkedHashMap écrit dans un fichier txt, mais montre « java.io.StreamCorruptedException: en-tête de flux incorrect: 7B495020 »
Pour écrire à LinkedHashMap j'ai essayé la méthode;
public void WriteBasicInfo(String name, String pass) throws IOException, ParseException {
Map<String, String> m;
try {
m = new LinkedHashMap<String, String>();
m.put("Name", name);
m.put("Password", pass);
BufferedWriter bw = new BufferedWriter(new FileWriter(FILE_NAME, false));
bw.write(m.toString());
bw.flush();
bw.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Et il écrit avec succès dans le fichier. Mais quand Iam essayant de lire le hashmap ci-dessus en utilisant cette méthode
public void readBasicInfo() throws IOException, ParseException, InvocationTargetException, ClassNotFoundException
{
ObjectInputStream is = new ObjectInputStream(new FileInputStream(FILE_NAME));
Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();
for(Map.Entry<String,String> m :myMap.entrySet()){
System.out.println(m.getKey()+" : "+m.getValue());
// String val1=m.get("Name");
}
ois.close();
}
il montre « java.io.StreamCorruptedException: en-tête de flux incorrect: 7B495020 », et aucune donnée est lu
J'ai essayé de lire toutes les entrées écrites dans hashmap, pour vérifier si elle est en train de lire ou non; mais en fait je veux juste lecture seule entrée « nom » stocké dans hashmap.
Vous êtes simplement: l'écriture sous forme de chaîne, mais en relisant attendant un objet sérialisé binaire!
Vous savez, qui est comme: vous mettez un œuf dans une boîte, et vous vous attendez pouvez ouvrir cette boîte et versez le lait de celui-ci dans un verre! Ce travail de coutume.
Ici:
bw.write(m.toString());
Vous écrivez la carte dans ce fichier sous forme de chaîne brute. Cela signifie que votre fichier contient maintenant des chaînes lisibles par l'homme!
Mais alors vous faites:
Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();
Ce qui attend à ce que le fichier contient un numéro de série des objets.
Longue histoire courte, ce sont vos options:
- continuez à écrire ces chaînes, mais vous devez implémenter votre propre analyseur qui lit les fichiers texte, et les transforme en objets dans les cartes
- au lieu d'écrire des chaînes de texte brut, utilisez une bibliothèque, comme gson ou jackson et sérialiser votre carte en tant que chaîne JSON (qui exige que toutes les clés / valeurs peuvent être sérialisés comme JSON)
- au lieu d'écrire du texte brut ou JSON, utilisez le mécanisme de sérialisation par défaut Java et serialize au contenu binaire qui exige que toutes les clés / valeurs implémentent l'interface Serializable. Voir ici pour un bon tutoriel comment faire en détail.
Ma recommandation: aller pour l'option 2 ou 3. 2 ajoute une dépendance à une bibliothèque 3ème partie, mais je pense qu'il est plus « commun » la pratique de nos jours.