Как прочитать LinkedHashMap написано в файле? - PullRequest
2 голосов
/ 15 мая 2019

Я хочу прочитать конкретное значение из LinkedHashMap, записанное в файле .txt, но показывает «java.io.StreamCorruptedException: недопустимый заголовок потока: 7B495020»

Для записи в LinkedHashMap я попробовал метод;

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

И он успешно записывает в файл.Но когда я пытаюсь прочитать вышеуказанную хэш-карту, используя этот метод

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

, он показывает «java.io.StreamCorruptedException: неверный заголовок потока: 7B495020», и никакие данные не читаются

Iпопытался прочитать все записи, записанные в hashmap, чтобы проверить, читает ли он или нет;но на самом деле я просто хочу, чтобы запись «name», доступная только для чтения, сохранялась в hashmap.

Ответы [ 2 ]

5 голосов
/ 15 мая 2019

Вы просто: пишете в виде строки, но читаете в ожидании двоичного сериализованного объекта!

Вы знаете, это похоже на: вы кладете яйцо в коробку, а затем ожидаете, что сможете открыть эту коробкуи налей молоко из него в стакан!Это не сработает.

Здесь:

bw.write(m.toString());

Вы записываете карту в этот файл в виде необработанной строки.Это означает, что ваш файл теперь содержит удобочитаемые строки!

Но тогда вы делаете:

Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();

Что предполагает, что файл содержит сериализованные объекты.

Короче говоря, вот ваши варианты:

  1. продолжайте писать эти строки, но затем вам нужно реализовать собственный синтаксический анализатор , который читает такие текстовые файлы,и превращает их обратно в объекты в картах
  2. вместо написания необработанных текстовых строк, используйте библиотеку, такую ​​как gson или jackson, и сериализуйте вашу карту как строку JSON (для этого необходимо, чтобы все ключи / значения могли быть сериализованы как JSON)
  3. вместо написания необработанного текста или JSON, используйте механизм сериализации Java по умолчанию и сериализацию в двоичный контент, который требует, чтобы все ключи / значения реализовывали интерфейс Serializable.Смотрите здесь учебник , как это сделать подробно.

Моя рекомендация: перейдите к варианту 2 или 3. 2 добавляет зависимость к сторонней библиотеке, ноЯ думаю, что это более «обычная» практика в наши дни.

1 голос
/ 15 мая 2019

Вам необходимо сериализовать / десериализовать объект, а не просто читать / записывать его представление toString в файл.

См .: https://javahungry.blogspot.com/2017/11/how-to-serialize-hashmap-in-java-with-example.html

...