java.io.EOFException при хранении HashMap во внутреннем хранилище - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу сохранить 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?

...