0

哇,我不敢相信有多少与加载和保存到内部存储器有关的问题。我发现我只能保存到与我的应用程序相关的保护区。我不确定我什至可以在那个区域创建一个目录。存储到我已经掌握的 SD,但要求是如果没有可用的 SD 卡或已被删除,则应用程序继续能够加载和保存用户设置。我有 120 个不同的数据项,所以共享偏好不是办法。缓存不是持久的。

我目前有一种方法:

public static void SaveUserPrefs()
{
 try
{
 //FileOutputStream fos = openFileOutput("userPrefs.dat", Context.MODE_PRIVATE);
 FileOutputStream fos = new FileOutputStream( "userPrefs.dat"); 
 BufferedOutputStream bos = new BufferedOutputStream(fos); //to get a buffered stream  
 ObjectOutputStream oos = new ObjectOutputStream(bos);
 oos.writeFloat(versionNumber);
 oos.writeInt(autoWifiStart);
 oos.writeInt(autoAirPlane);
 ... many more items and file close

我得到文件未找到异常 /userPrefs.dat 只读文件系统 您会认为相同的代码可以在外部或内部工作,但不是。我也尝试了注释掉代码,结果相同。我在哪里以及如何保存这些数据?我需要做一些不同的事情来加载它吗?我确实将权限设置为 save_external_Storage。

4

1 回答 1

1

我发现我只能保存到与我的应用程序相关的保护区。

在内部存储上,这是正确的。

我不确定我什至可以在那个区域创建一个目录。

用于getFilesDir()检索File指向内部存储上应用程序区域的对象,然后调用mkdirs()File对象以创建子目录。后者是标准的 Java 文件 I/O。

我有 120 个不同的数据项,所以共享偏好不是办法。

中的项目数量没有特别限制SharedPreferencesSharedPreferences存储在 XML 文件中。

我得到文件未找到异常 /userPrefs.dat 只读文件系统

您提供了无效路径。用于getFilesDir()获取File指向内部存储上应用程序区域的对象,然后使用适当的File构造函数创建File指向内部存储上特定文件的对象。在构造函数中使用后一个File对象FileOutputStream。同样,除了 之外getFilesDir(),这是标准的 Java 文件 I/O。

你会认为相同的代码可以在外部或内部工作,但不是

该代码也不适用于外部存储,因为您提供的路径不在外部存储上。

我在哪里以及如何保存这些数据?

就个人而言,我永远不会使用ObjectOutputStream. 对于 120 个项目,我肯定会考虑使用 SQLite 数据库,否则我会将数据序列化为 JSON 或 XML。这些选项中的任何一个都比恕我直言更容易调试ObjectOutputStream

我需要做一些不同的事情来加载它吗?

您需要按照标准 Java 文件 I/O构造File指向相​​关文件的适当对象,以便与某种类型的.InputStream

我确实将权限设置为 save_external_Storage。

WRITE_EXTERNAL_STORAGE不需要写入内部存储。

于 2012-07-10T23:34:42.757 回答