应用程序重启时,保存在getFilesDir()中的文件将丢失

时间:2015-06-23 12:29:10

标签: java android

我是Android编程的新手,所以我的问题的答案很有希望。

我有一个应用程序可以从通过网络连接的PC程序接收文件。然后,此文件将在内部存储并由应用程序使用。当应用程序启动时,它会读取文件(这是类' WordList'它基本上是一个HashMap)的序列化实例,并将数据显示给用户。在任何时候,pc程序都可以将新文件发送到android设备,该设备接收文件并覆盖内存中的旧文件。

接收并存储文件如下:

try(ServerSocket serverSocket = new ServerSocket(port)){

    Socket pc = serverSocket.accept();
    ObjectInputStream ois = new ObjectInputStream(pc.getInputStream());
    list = (WordList)ois.readObject();
    ois.close();
    pc.close();

 }catch(IOException | ClassNotFoundException e){
     //Display error message and stuff
 }

 try {
     ObjectOutputStream oos = new ObjectOutputStream(
                               openFileOutput("save.dat", Context.MODE_PRIVATE));
     oos.writeObject(list);
     oos.flush();
     oos.close();
 } catch (IOException e) {
     //Display error message and stuff
 }

当应用启动时,它会读取如下文件:

if (new File(getFilesDir() + "save.dat").exists()) {

     try {
         ObjectInputStream ois = new ObjectInputStream(
                                  new FileInputStream(getFilesDir() + "save.dat"));
         WordList list = (WordList)ois.readObject();

         /*Now set a reference to the list object so it can be used by the app, 
         then start displaying stuff to the user...*/
         ModelController.getInstance().setList(list);
         ModelController.getInstance().start(this);
     }catch(IOException | ClassNotFoundException e){
         //Display error message and stuff
     }
 }else{ 
     //Display error message and stuff
 }

问题是应用程序在启动时无法找到该文件。如果我从电脑发送一个新文件,它将被正确接收和使用,没有错误消息。但是,如果我重新启动应用程序,则找不到,我会收到来自“其他”的错误消息。最后一个代码块的一部分。我忘记了什么?

2 个答案:

答案 0 :(得分:3)

new File(getFilesDir() + "save.dat")

应该是

new File(getFilesDir(), "save.dat")

最后一个将文件分隔符追加到getFilesDir()"save.dat"的返回值

之间

而不是使用

  new FileInputStream(getFilesDir() + "save.dat")

我们

openFileInput("save.dat")

here您可以找到文档

答案 1 :(得分:0)

您可以查看save.dat在磁盘上的位置。

我的假设是将保存更改为:

ObjectOutputStream oos = new ObjectOutputStream(
                     openFileOutput(getFilesDir() + "save.dat", Context.MODE_PRIVATE));