Android 如何从内部内存(而不是SD、SQL、非共享首选项)保存和加载数据

Android 如何从内部内存(而不是SD、SQL、非共享首选项)保存和加载数据,android,file-io,filesystems,Android,File Io,Filesystems,哇,我不敢相信有多少问题与加载和保存到内存有关。 我发现我只能保存到与我的应用程序相关的受保护区域。 我甚至不确定我能不能在那个区域创建一个目录。 存储到我掌握的SD,但要求是,如果没有可用的SD卡或SD卡已被删除,应用程序继续能够加载和保存用户设置。我有120个不同的数据项,所以共享首选项不是一种方式。缓存不是持久的 我目前的方法是: public static void SaveUserPrefs() { try { //FileOutputStream fos = openFileOu

哇,我不敢相信有多少问题与加载和保存到内存有关。 我发现我只能保存到与我的应用程序相关的受保护区域。 我甚至不确定我能不能在那个区域创建一个目录。 存储到我掌握的SD,但要求是,如果没有可用的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 您可能认为相同的代码可以在外部或内部工作,但实际上并非如此。 我也用同样的结果尝试了注释代码。 在何处以及如何保存此数据? 我需要做一些不同的事情来加载它吗? 我设置了保存外部存储的权限

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

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

我甚至不确定我能不能在那个区域创建一个目录

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

我有120个不同的数据项,所以共享首选项不是一种方式

SharedReferences
中的项目数量没有特别限制<代码>共享引用存储在XML文件中

我获取的文件未找到,只读文件系统除外/userPrefs.dat

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

您可能认为相同的代码可以在外部或内部工作,但实际上并非如此

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

在何处以及如何保存此数据

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

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

您需要构造相应的
文件
对象,指向所讨论的文件,以便在标准Java文件I/O之后与某种类型的
InputStream
一起使用

我设置了保存外部存储的权限


WRITE\u EXTERNAL\u STORAGE
不需要写入内部存储。

对Java来说是新手,但作为一名长期的C程序员,我发现很难按照您的指示将所表达的单词放入代码中。让我问另一个问题。。。在内部受保护存储中创建文件时,是否有任何应用程序显示此文件?也许我之前已经找到了正确的答案,并认为它在Astro File Manager中不可见而不予理会,因为它是内部的且受保护的,并且只对它所属的应用程序可见?@user1445716:“当我在内部受保护的存储中创建文件时,是否有任何应用程序显示此文件?”——仅当用户已在其手机上建立根目录时(即,能够以Linux超级用户权限运行应用程序),并且正在运行一些旨在检查整个设备的文件管理器。最后一个问题。我是否需要创建标准目录,还是在安装应用程序时始终将目录创建为/data/data/com.myapp.somewhere/files?好的,确实是最后一个问题:我目前正在onCreate中获取InternalDirectory名称并将其存储在中静态变量。如:\n File temp=getFilesDir();InternalDirectory=String.format(“%s”,temp”);\n在我使用的加载文件方法中:\n FileInputStream fis=new FileInputStream(InternalDirectory+“/userPrefs.dat”);\n是否有更好的方法来处理抓取内部目录名?现在可以工作了…感谢您对这个老问题的帮助。@user1445716:“我需要创建标准目录吗”--由
getFilesDir()
指向的目录是自动为您创建的。“有更好的方法来处理抓取内部目录名吗?”--在需要时对任何
上下文
调用
getfiledir()
。因为它只是一个
File
对象,所以将其保存在静态数据成员中不会有特别的内存泄漏风险,所以您可能对现有内容没有意见,但我倾向于在需要时获取该值。