Android 如何从内部内存(而不是SD、SQL、非共享首选项)保存和加载数据
哇,我不敢相信有多少问题与加载和保存到内存有关。 我发现我只能保存到与我的应用程序相关的受保护区域。 我甚至不确定我能不能在那个区域创建一个目录。 存储到我掌握的SD,但要求是,如果没有可用的SD卡或SD卡已被删除,应用程序继续能够加载和保存用户设置。我有120个不同的数据项,所以共享首选项不是一种方式。缓存不是持久的 我目前的方法是:Android 如何从内部内存(而不是SD、SQL、非共享首选项)保存和加载数据,android,file-io,filesystems,Android,File Io,Filesystems,哇,我不敢相信有多少问题与加载和保存到内存有关。 我发现我只能保存到与我的应用程序相关的受保护区域。 我甚至不确定我能不能在那个区域创建一个目录。 存储到我掌握的SD,但要求是,如果没有可用的SD卡或SD卡已被删除,应用程序继续能够加载和保存用户设置。我有120个不同的数据项,所以共享首选项不是一种方式。缓存不是持久的 我目前的方法是: public static void SaveUserPrefs() { try { //FileOutputStream fos = openFileOu
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
对象,所以将其保存在静态数据成员中不会有特别的内存泄漏风险,所以您可能对现有内容没有意见,但我倾向于在需要时获取该值。