内部存储:
在data/data/packagename中(一个app对应一个packagename)
常见文件夹有cache ,code_cache ,files , databases , shared_prefs 和一个lib文件
files: 文件缓存目录,一般存小的文件缓存,如果是图片,不建议放这里,一般放到外置卡。
cache目录: 存放一些其他缓存
databases: 存放数据库
lib: 存放应用的so目录
shared_prefs: 存放应用的SharedPreferences
常用方法:
1. Context.getFilesDir() 返回一个File对象,当Log打印出file.getAbsolutePath()时看到的是:
/data/user/0/packagename/files ,
而user下的文件夹0就是data\data的一个链接名, 实际位置就是在 /data/data/packagename/files里
注意安装app后files文件夹里若没有任何东西时是不会看到这个文件夹的,而执行以下代码:
File f1 = getFilesDir(); Log.e("TAG","getFilesDir(): " + f1.getAbsolutePath()); try { File dir1 = new File(getFilesDir(),"dir1"); if (!dir1.exists()){ dir1.mkdir(); } File f = new File(dir1, "test1.txt"); FileOutputStream fos = new FileOutputStream(f); String txt = "Hello test1!"; fos.write(txt.getBytes()); fos.close(); }catch (Exception e){ e.printStackTrace(); }
结果会自动在/data/data/packagename中先创建一个files文件夹,在files里再创建了一个dir1文件夹,dir1中有一个test1.txt
若不需要创建文件夹,安卓还为我们提供了一个简便方法,得到可直接在files中写入文件的输出流,执行以下代码:
String fileName = "test2.txt"; String txt = "hello test2"; FileOutputStream fos; try { fos = openFileOutput(fileName,MODE_PRIVATE); fos.write(txt.getBytes()); fos.close(); }catch (Exception e){ e.printStackTrace(); }
Context.openFileOutput(String name, int mode)返回一个输出流
Context.openFileInput(String name) 返回一个输入流
此时目录结构如下:
2. getCacheDir() 和 getCodeCacheDir() 显然分别返回 /data/data/packagename下cache和code_cache对应的File对象
3.在包下创建目录(与files,cache这些文件夹同级)
File myFile = getDir("myfile",MODE_PRIVATE); if(!myFile.exists()){ myFile.mkdir(); }
结果目录为:
app_myfile 就是自己创建的文件夹
总结:
1). 对files:getFilesDir()
== new File("/data/data/"+ context.getPackageName() + "/files")
(openFileOutput,openFileInput得到的是文件流)
2).对cache和code_cache
getCacheDir() 和 getCodeCacheDir()
== new File("/data/data/"+ context.getPackageName() + "/cache") 和 new File("/data/data/"+ context.getPackageName() + "/code_cache")
3).对根目录
getDir(String name, int mode)
== new File("/data/data/"+ context.getPackageName() + "/" + name)
4) . 对shared_prefs
1.Context类中的getSharedPreferences(String name, int mode) 方法
SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);
2.Activity类中的getPreferences(int mode) 方法
用法同上,不用传入sp的name是因为使用此方法是会自动将当前活动的类名作为sp的文件名
3.PreferenceManager类中的getDefaultSharedPreferences(Context context) 方法
这是一个静态方法,接收一个Context参数,并自动使用应用程序的包名作为前缀来命名sp文件