文件未写入设备

时间:2012-06-24 15:34:47

标签: java android file fileoutputstream objectoutputstream

我一直在尝试一百种不同的方法来解决我的问题,但由于某种原因,它们简单无法运作。 我正在尝试快速而肮脏的方式,因为我的应用程序是持久的。它基本上在销毁时需要保存很多对象,所以我想我会把它放到ArrayList中,然后使用ObjectOutputStream将ArrayList写入文件。

public void onStop() {
    super.onStop();
    Log.d("Event", "Stopped");
    FileOutputStream fos = null;
    ObjectOutputStream oos = null;
    try {
        fos = openFileOutput("Flights", MODE_WORLD_WRITEABLE);
        oos = new ObjectOutputStream(fos);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    ArrayList<Flight> alFlightList = new ArrayList<Flight>();
    Iterator it = flightMap.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        alFlightList.add((Flight) pairs.getValue());
    }
    try {
        oos.writeObject(alFlightList);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        Log.d("Info", "File created!");
    }      
}

我有一个类似的算法再次读出它,但它抱怨没有任何文件可供阅读。 我知道使用文件进行持久化并不是最好的做法,但这就像前面提到的那样,应该是一个快速而肮脏的解决方案。 (但是我现在使用它的时间,也可能花在制作数据库上。。)。 谢谢!

3 个答案:

答案 0 :(得分:1)

来自Saving Persistent State的文档,

  

通常有两种持久状态而不是活动状态   将处理:共享文档类数据(通常存储在   SQLite数据库使用内容提供者)和内部状态如   用户偏好。

     

对于内容提供商数据,我们建议活动使用“编辑”   放置“用户模型。即,用户进行的任何编辑都是有效的   立即制作,无需额外的确认步骤。   支持这种模式通常只需遵循以下两个方面   规则:

     

创建新文档时,支持数据库条目或文件   它是立即创建的。例如,如果用户选择写一个   新的电子邮件,一旦他们创建了该电子邮件的新条目   开始输入数据,以便在之后进行任何其他活动   此时此电子邮件现在将显示在草稿列表中。当一个   调用activity的onPause()方法,它应该提交支持   内容提供者或文件用户所做的任何更改。这确保了   这些变化将被任何其他活动所见   跑。您可能希望更积极地提交数据   在活动生命周期的关键时刻:例如之前   在完成自己的活动之前,开始一项新的活动   用户在输入字段等之间切换

因此,如果您想“正确”地执行此操作,我会将数据保存在onPause ...并且我可能会使用某种类型的SQLite数据库来保存状态。您还应该使用AsyncTask在单独的线程上执行文件I / O,因为这类事情可能会阻止UI线程并使您的应用程序崩溃。

如果你想要一个快速而肮脏的方式(即如果你没有在Android市场上发布这个应用程序),那么我打赌问题是你正在尝试执行onDestroy中的文件I / O,不保证被调用。这是在onPause中执行文件读/写的另一个原因。

我建议的最后一件事是阅读internal/external storage上的文档。可能是您没有写入正确的目录,因为您没有这样做的文件权限。您应该像这样执行文件I / O:

String FILENAME = "FLIGHTS";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(...);
fos.close();

答案 1 :(得分:0)

在/ sdcard / Flights中替换Flight,否则它会在null空间中创建一个文件。 :) 我不确定它是否有用。

答案 2 :(得分:0)

为什么不使用数据库?在创建或重新启动应用程序时,从数据库中回调所有设置?

您还可以使用onpause()或onstop()方法将所有数据存储到数据库中。