内部存储与外部存储
内部存储
用户无法在手机文件夹访问的目录 /data,此目录下常用的有(不同rom会有差异)
/data/app用于保存已安装应用的apk文件;
/data/data保存已安装应用的app信息;
/data/data/package name保存具体应用下的信息(如SharePreferences、DataBase等),当app卸载时,此目录及其以下文件全部删除。
外部存储
用户通过手机文件夹访问的目录,如DCIM相册文件夹,Download下载文件的位置
外部存储包含出厂时自带的存储,也包含sdcard。
外部存储(除External获取的)的数据与app无关联性,知道具体路径便可访问。因此app创建的文件夹无法在app卸载时被删除。长此以往,除用户主动删除,外存的空间会逐渐减少。
获取
1、getCacheDir() ----> /data/data/package name/cache/
2、getFilesDir() ----> /data/data/package name/files/
3、getExternalCacheDir() ----> 外部存储路径/Android/data/package name/cache/
4、getExternalFilesDir() ----> 外部存储路径/Android/data/package name/files/
5、getExternalStorageDirectory() ----> 非scared路径的外部存储路径
1、2、3、4跟随app的包名创建的目录,清除缓存或卸载会将数据清除
1、2、3、4不需要申请权限,
3、4、5需要判断是否存在外置SD(以前需要判断scared是否已插入,但随着发展android机基本都挂有外部存储)
5、需要自己手动维护文件结构
6.0之后动态申请的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
文件操作
避免重复造轮子,取其我认为需要记录的内容
Java和Android文件操作
File(File dir, String name)
File(String path)
File(String dirPath, String name)
File(URI uri)
这些构造方法的实质都是一样的,就是构造一个File实例,必须提供一个完整的文件路径。
构造了一个File实例,并不是说就新建了一个文件或文件夹,这个File实例,只是实际系统内文件实体的一个代表。
重要方法:public boolean exists() 判断文件或文件夹是否存在
public boolean isFile() 判断是否为文件
public boolean isDirectory 判断是否为文件夹
public boolean createNewFile() 根据制定的路径和文件名创建一个新的,空的文件
public boolean mkdir() 根据制定的路径创建文件夹 (一级操作)
public boolean mkdirs() 根据制定的路径创建文件夹 (多级操作)
public boolean delete() 删除文件或文件夹
public boolean renameTo(File dest) 重命名文件或文件夹
public long length() 获得文件的长度,单位为 byte(文件夹不可用)
public String getName() 获得文件或文件夹的名字
public String getAbsolutePath() 获得文件或文件夹的绝对路径
pubic String getPath() 获得文件或文件夹的路径
public File[] listFiles() 返回文件夹内所有的File 对象
public String[] list() 返回文件夹内所有的文件或文件夹的名字
读写操作
Context已经实现了快捷方法:
public FileInputStream openFileInput(String name)
public FileOutputStream openFileOutput(String name, int mode)
查看源码会得知文件在getFilesDir()目录下。
模式:
私有模式
1、只能被创建这个文件的当前应用访问
2、若文件不存在会创建文件;若创建的文件已存在则会覆盖掉原来的文件
Context.MODE_PRIVATE = 0x0000;追加模式
1、私有的
2、若文件不存在会创建文件;若文件存在则在文件的末尾进行追加内容
Context.MODE_APPEND = 0x8000;可读模式
1、创建出来的文件可以被其他应用所读取
Context.MODE_WORLD_READABLE=0x0001;可写模式
1、允许其他应用对其进行写入。
Context.MODE_WORLD_WRITEABLE=0x0002;
以上文件操作模式均针对保存在手机自带存储空间的文件。若文件存储在SDCard上,则不受读写控制。
流
读写操作中有FileInputStream、FileOutputStream两个流,但实际java中的流有两类。
字节流:读取的数据以字节为单位(byte),8bit
字符流:读取的数据以字符为单位(char),16bit