android中activity的父类context提供了一个openFileOutput()方法,用来写入文件,我们知道android对文件存放的位置有着严格的管理,访问共有文件时,必须提供权限,但是通过这个方法就不需要权限,openFileOutput有两个参数,
1.第一个参数是文件名
这个文件名不能包含路径,因为默认创建的文件会放在
/data/data/<package-name>/files/的文件夹下面,下面是我的截图
通过outFileOutput的文件就会放在这里,
第二个参数是操作模式,
下面是官方给出的文档说明
代表的是打开与应用程序包所关联的私有文件,是私有文件,因为使用了内部存储,所以不需要权限,
参数二说明
MODE_PRIVATE:指定同名文件时,会覆盖原先的文件
MODE_APPEND:指定同名文件,会追加内容
剩下的由于存在安全问题,使用会报出安全异常
下面是通过openFileOutPut操作文件的案例
String data="我有一头小毛驴,从来也不骑";
FileOutputStream fileOutputStream = openFileOutput("xiaoxiao", MODE_PRIVATE);
fileOutputStream.write(data.getBytes());
那么我们就会在内部文件夹下产生一个xiaoxiao的文件,看下图片
下面是第二种写法
File file = new File(getFilesDir(), "user");
FileOutputStream fileOutputStream1 = new FileOutputStream(file);
fileOutputStream1.write("生命就是简单简单的生活".getBytes());
图片在上面,可能给更多的是对getFilesDir()这个方法感到好奇,那么看一下文档
大致翻译为
返回文件系统目录的绝对路径,其中存储了使用openFileOutput(String, int)创建的文件。由于此路径是内部存储,因此不需要对返回的路径进行读或写操作。
关键的一句是其中存储了使用openFileOutput(String, int)创建的文件,那么我们就能猜到这个方法返回的是/data/data/<package-name>/files这个文件夹
,因为openFileOutput的文件就放在这里,
当然不能光想,我们通过程序测试了一下
File file4=getFilesDir();
Log.d(TAG, "文件的路径为:"+file4.getPath());
Log.d(TAG, "是文件夹吗?"+file4.isDirectory());
打印的结果如下
看来之前的猜想是正确的
之后我继续看了文档,发现了其他的方法
- getCacheDir();
- getDir();
然后自己又去测试了,测试代码如下
File file1 = new File(getCacheDir(), "password");
fileOutputStream1 = new FileOutputStream(file1);
fileOutputStream1.write("数据存储技术全方案".getBytes());
//会在应用程序的文件目录下创建一个文件夹
File file2 = getDir("chenjing", MODE_PRIVATE);
fileOutputStream = new FileOutputStream(file2);
之后发生了什么?
一张图让你看懂
从上面的图以及自己的代码我们就能看出来
getCacheDir():对应的是/data/data/<package-name>/cache文件夹
getDir():对应的是/data/data/<package-name>.也就是应用程序文件主文件夹,我们创建的chenjing会产生一个文件夹,自动加上app的前缀
之后我又看到了这些
getExternalCacheDir();
getExternalFilesDir();
从字面来理解:得到外部缓存文件夹,获得外部文件夹
File file1=getExternalCacheDir();
Log.d("file",file1.getPath());
//对应的文件夹是/mnt/sdcard/Android/data/com.mingrisoft.myapplication/cache
对应的是sd卡的android/data/<package-name>/cache
文件夹,
原来android 在外部存储上会为每一个app 建立私有文件夹 Android/data/应用包名/ 下 当然这里的文件夹虽然是私有,但是对其他人都是可读可写的。所以不太安全 ,同时也会随着应用的的卸载二回被删除
File file=getExternalFilesDir(null);
Log.d("file", "外部文件路径"+file.getPath());//外部文件路径/mnt/sdcard/Android/data/com.mingrisoft.myapplication/files
对应的是files文件夹。本质来说和内部存储差不多,只不过更安全
那么如果想要存放公有的文件
公有文件存储必须要声明WRITE_EXTERNAL_STORAGE 权限.
公有文件不属于app 所有。当你的应用被删除的时候应该被保留的文件,如用户的相片,铃声等。
想要获取外部存储的公有文件夹, 你可以通过:下面的程序获得**
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), FILENAME);
这里面使用了Environment类,这个类提供了对环境变量的访问,
看下方法getExternalStoragePublicDirectory(String type)
参数类型
DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS, or DIRECTORY_DCIM.