微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

附加到ObjectOutputStream不会更改任何内容

如何解决附加到ObjectOutputStream不会更改任何内容

这是我的问题。在我的DetailActivity中,我检查文件是否为空。如果是这样,我将创建一个新的File并将一个对象写入该文件没有问题。如果不是,则表示文件中已写入数据对象列表,如下所示:

try{
      val file = File(filesDir,"Example Shelf")
      val outputStream = openFileOutput(file.name,Context.MODE_APPEND)
      if(file.length() != 0.toLong()){
           val inputStream = openFileInput(file.name)
           gameDetailviewmodel.addGametoExistingShelf(outputStream,inputStream,data)
      } else {
           file.createNewFile()
           gameDetailviewmodel.addGametoNewShelf(outputStream,data)
      } catch(...)

如果文件中写入了一个对象,则我想从本质上向该列表附加一个新的数据对象。为此,我读取了文件,将从文件中读取的列表分配给新变量,然后将其重新写入文件

fun addGametoExistingShelf(fos: FileOutputStream,fis: FileInputStream,data: GameData){
        val prevIoUsList = ObjectInputStream(fis).readobject() as MutableList<GameData>
        val newList = prevIoUsList
        newList.add(data)
        ObjectOutputStream(fos).writeObject(newList)
        fos.close()
        fis.close()
}

问题:写入文件后,我想从另一个Activity中读取它,以便可以在RecyclerView中显示它。但是,当我读取文件时,它不包含我最近写入文件newList添加的任何数据对象。它仅包含prevIoUsList中的数据对象,这是目前为止的过期数据。

val file = File(filesDir,"Example Shelf")
if(file.isFile && file.length() != 0.toLong()){
  val inputStream = openFileInput(file.name)
  shelfviewmodel.fetchShelfData(inputStream)
}

Shelfviewmodel.fetchShelfData

fun fetchShelfData(fis: FileInputStream){
    val objis = ObjectInputStream(fis)
    //mutablelivedata<List<GameData>>
    shelfData.value = objis.readobject() as List<GameData>
    objis.close()
}

这是怎么回事?我花了数小时试图调试它,但无济于事。 任何帮助将不胜感激。预先谢谢你:)

解决方法

进一步阅读后,我发现无法将数据追加到已经存在的文件中,因为ObjectOutputStream会将头文件添加到任何文件中并将其写入文件。

在同一文件上多次调用ObjectOutputStream.writeObject(data)将由于存在多个标头而导致文件损坏。当ObjectInputStream随后读取文件时,不足以解析出写入文件的所有多余内容(例如标头)。请参阅here以获得文档。

要解决此问题,我只是使用file.createNewFile()重新创建了一个新文件,并将新数据写入其中。因为该文件实质上是“重新创建”的,所以先前写入的所有标头信息都不再存在-它是一个具有相同名称的空白文件。

if(file.length() != 0.toLong()){
   val fileInput = openFileInput(file.name)
   val newData = gameDetailViewModel.fetchDataFromExistingShelf(fileInput,data)
   file.createNewFile() //File is recreated
   val fileOutput = openFileOutput(file.name,Context.MODE_PRIVATE)
   gameDetailViewModel.writeObjectToFile(fileOutput,newData) //Object is written to new,recreated file

鉴于我花了几个小时尝试调试,希望以后能帮助到其他人!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。