Я хочу сохранить HashMap во внутреннем хранилище Android, следуя вики и этому очень полезному учебнику .HashMap, который мне нужно сохранить, имеет тип HashMap<Int, Long
.Int
для хранения id
с и Long
для хранения epoch
миллисекунд.Вот мои методы:
fun getNotificationsMap(context: Context): HashMap<Int, Long> {
val fis = context.openFileInput(Notifier.NOTIFICATIONS_MAP_FILE)!!
if (fis.isFileEmpty()) {
return hashMapOf()
}
val ois = ObjectInputStream(fis)
val map: HashMap<Int, Long> = ois.readObject() as HashMap<Int, Long>
ois.close()
return map
}
fun setNotificationOfId(id: Int, epoch: Long, context: Context) {
val fos = context.openFileOutput(
Notifier.NOTIFICATIONS_MAP_FILE, Context.MODE_PRIVATE
)!!
val oos = ObjectOutputStream(fos)
val updatedNotificationsMap = getNotificationsMap(context)
updatedNotificationsMap[id] = epoch
oos.writeObject(updatedNotificationsMap)
oos.close()
}
fun newNotificationId(context: Context): Int {
val notifications = getNotificationsMap(context)
val latestId = notifications.keys.max()
return if (latestId == null || latestId == 0)
Notifier.BASE_NOTIFICATION_ID_COUNT
else
latestId + 1
}
private fun FileInputStream.isFileEmpty(): Boolean {
val br = BufferedReader(InputStreamReader(this))
Log.i(TAG, "FileInput Stream is empty!")
return br.readLine() == null
}
Когда я звоню getNotificationsMap(context)
, я получаю следующую ошибку:
java.util.concurrent.ExecutionException: java.io.EOFException
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2344)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2813)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:301)
at com.jagoancoding.planyoursemester.util.DataUtil.getNotificationsMap(DataUtil.kt:70)
at com.jagoancoding.planyoursemester.util.DataUtil.newNotificationId(DataUtil.kt:88)
at com.jagoancoding.planyoursemester.util.Notifier$NotificationWorker.doWork(Notifier.kt:194)
at androidx.work.Worker$1.run(Worker.java:85)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Где DataUtil.kt:70
относится к строке
val ois = ObjectInputStream(fis)
Итак, я хочу знать, как правильно сохранить этот hashmap?