Как сохранить в файл и прочитать HashMap в ANDROID?
Всем доброго времени суток!
Как можно сохранить Лист<Мап<Стринг, Стринг>> (написал на русском, иначе отображаться не будет) в файл, а потом еще и прочитать его оттуда?
Спасибо заранее за ответы
File file = new File(*ваши данные*);
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject( yourObject );
outputStream.flush();
outputStream.close();
Еще можно конвектировать в JSON и также сохранить в текстовый файл(хотя в вашем случае, первый способ будет проще)
Потом читаете JSON из файла и парсите в List<>
Спасибо за ответ. Я пробовал сохранить в файл таким способом, но потом при попытке считать его из файла получалась хрень какая-то. Массив я использую с разметкой simple_list_item_2 поэтому хранить в файле надо две строки для одного элемента и считать их надо так, чтобы все правильно расставилось. А по поводу JSON, то при более менее крупных размерах массива, может упасть производительность, поэтому здесь лучше использовать хранение в файл
JSON это текстовый формат передачи данных. Вы можете конвертировать объекты в JSON и после сохранить их в файл. А затем прочитать их. И какая именно "хрень" получается у Вас при чтении способом выше?
aobiedkov: эта "хрень" заключается в том, что при чтении из файла и добавлении данных в массив, он добавляет не данные, а текст вида : {"tag1", value1 "\n" "tag2", value2} , и вот это добавляется в элемент listview. А про JSON, если выполнять конвертирование в основном потоке, то при больших размерах массива, можно получить упадок в производительности
Не совсем понятны ваши проблемы. Сериализация в java по умолчанию конвертирует объект в байты, для этого сериализуемый объект и все кто в нем используется должны implement интерфейс serializable. Далее вы записываете объект так как показано выше, а читаете:
FileInputStream fis = new FileInputStream("temp.out");
ObjectInputStream oin = new ObjectInputStream(fis);
TestSerial ts = (TestSerial) oin.readObject();
И вам восстанавливает ваш лист мап. Подскажите пожалуйста как вы читаете из файла сериализуеммые данные?
aobiedkov: в целом мне понятно как читать и записать лист мап, мне не понятно как его добавить в listview, у меня на данный момент такая проблема, вот я добавил в лист мап значение, зашел в фрагмент, и мой элемент там отобразился, и по идее должен был сохраниться в файл, как только я выйду из фрагмента, но этого не происходит, я выхожу из фрагмента (и из приложения) а после запуска у меня показывает что список чист, лог же говорит что файл есть, и мол все прекрасно и все как надо, но я не знаю как считать данные и добавить в list view при каждом запуске. На данный момент я добавляю их через цикл:
File file = new File(getActivity().getFilesDir(), "file");
Log.e("LOG", String.valueOf(file.exists()));
Log.e("LOG", String.valueOf(file.getAbsolutePath()));
if(!file.exists()) {
file.createNewFile();
Log.e("LOG", "Файл создан");
}
FileInputStream f = new FileInputStream(file);
ObjectInputStream s = new ObjectInputStream(f);
s.readObject();
Map fileObj2 = new HashMap();
for (int i = 0; i < fileObj2.size(); i++) {
fileObj2.get("line1");
fileObj2.get("line2");
array.add(fileObj2);
}
s.close();
Ну хотя бы потому что вы создаете новую мапу и по ней же идете, хотя она пустая:
Map fileObj2 = new HashMap(); // fileObj2.size() = 0
for (int i = 0; i < fileObj2.size(); i++) { // fileObj2.size() = 0
А чтение объекта идет в воздух:
s.readObject();
Читайте предыдущий пример, там написано как сразу восстановить готовый объект:
FileInputStream fis = new FileInputStream("temp.out");
ObjectInputStream oin = new ObjectInputStream(fis);
List<> obj = (List) oin.readObject();
И после этого у вас будет List уже заполненный записанными ранее в файл элементами.
aobiedkov: я это заметил, но смотрите, если я добавлю вот так:
Map fileObj2=(HashMap) s.readObject();
то у меня будет ошибка
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.HashMap
Да не нужно ничего конвертировать! Вы записываете в файл ArrayList, вот и доставайте ArrayList:
//Запись
List> mylist = new ArrayList<>() //ваш лист который хотите сохранить в файл
File file = new File(*ваши данные*);
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject( mylist );
outputStream.flush();
outputStream.close();
//Чтение:
FileInputStream fis = new FileInputStream(*ваши данные*);
ObjectInputStream oin = new ObjectInputStream(fis);
List> myReadList = (ArrayList>) oin.readObject(); //Получаем точно так же лист как mylist в примере "Запись".
Все, он заполнен значениями и сразу готов к работе.
Почитайте подробнее о сериализации в java. А именно о сохранении и чтении объектов. Может поможет habrahabr.ru/post/60317