Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 追加到ObjectOutputStream不会更改任何内容_Android_File_Kotlin_Fileinputstream - Fatal编程技术网

Android 追加到ObjectOutputStream不会更改任何内容

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

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

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