如何解决附加到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 举报,一经查实,本站将立刻删除。