Android 追加到ObjectOutputStream不会更改任何内容
这是我的问题。在我的DetailActivity中,我检查文件是否为空。如果是,我会创建一个新文件并向该文件中写入一个对象,没有问题。如果不是,这意味着文件有一个写入的数据对象列表,如下所示:Android 追加到ObjectOutputStream不会更改任何内容,android,file,kotlin,fileinputstream,Android,File,Kotlin,Fileinputstream,这是我的问题。在我的DetailActivity中,我检查文件是否为空。如果是,我会创建一个新文件并向该文件中写入一个对象,没有问题。如果不是,这意味着文件有一个写入的数据对象列表,如下所示: try{ val file = File(filesDir, "Example Shelf") val outputStream = openFileOutput(file.name, Context.MODE_APPEND) if(file.len
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()
}
ShelfViewModel.fetchShelfData
fun fetchShelfData(fis:FileInputStream){
val objis=对象输入流(fis)
//可变LiveData
shelfData.value=objis.readObject()作为列表
objis.close()
}
这里发生了什么?我花了好几个小时试着调试,但都没有用。
任何帮助都将不胜感激。提前感谢:)进一步阅读后,我发现无法将数据附加到现有文件中,因为
ObjectOutputStream
会将头添加到它对文件所做的任何和所有写入操作中
在同一个文件上多次调用ObjectOutputStream.writeObject(data)
,会由于存在多个头而导致文件损坏。当ObjectInputStream
随后读取该文件时,解析写入该文件的所有额外内容(例如头)是不够明智的。有关文档,请参阅
为了解决这个问题,我只需使用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
考虑到我花了几个小时试图调试它,我希望它能够帮助以后的人 在打开inputstream之前关闭outputstream。@blackapps更改了代码,使每个流在打开另一个流之前关闭。一切都没有改变。经过进一步的调试,我确定了
ObjectOutputStream(fos).writeObject(newList)
并没有实际写入文件。我只是不知道为什么它不写。。。
fun fetchShelfData(fis: FileInputStream){
val objis = ObjectInputStream(fis)
//MutableLiveData<List<GameData>>
shelfData.value = objis.readObject() as List<GameData>
objis.close()
}
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