通过file来进行数据持久化
and中通过file来进行数据持久化和Java中对文件及目录的操作是一样的:本质是获取文件数据流,通过文件数据流来写入或者读出数据;
文件位置在:/data/data/<packagename>
/files目录
文件存储则只能通过本应用访问,其他应用不能访问,在卸载该应用的时候文件也会一并卸载;
1:创建文件对象:
File file = new File(String url);
File file = new File(String urlP,String urlS);
File file = new File(File file,String url);
File file = new File(URI uri);
2:对文件的一些基本操作—-方法摘要
boolean canRead()
//测试应用程序是否可以读取此抽象路径名表示的文件。
boolean canWrite()
//测试应用程序是否可以修改此抽象路径名表示的文件。
int compareTo(File pathname)
//按字母顺序比较两个抽象路径名。
boolean createNewFile()
//当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。
static File createTempFile(String prefix, String suffix)
//在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
static File createTempFile(String prefix, String suffix, File directory)
//在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
boolean delete()
//删除此抽象路径名表示的文件或目录。
boolean equals(Object obj)
//测试此抽象路径名与给定对象是否相等。
boolean exists()
//测试此抽象路径名表示的文件或目录是否存在。
File getAbsoluteFile()
//返回抽象路径名的绝对路径名形式。
String getAbsolutePath()
//返回抽象路径名的绝对路径名字符串。
File getCanonicalFile()
//返回此抽象路径名的规范形式。
String getCanonicalPath()
//返回抽象路径名的规范路径名字符串。
String getName()
//返回由此抽象路径名表示的文件或目录的名称。
String getParent()
//返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null。
File getParentFile()
//返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null。
String getPath()
//将此抽象路径名转换为一个路径名字符串。
int hashCode()
//计算此抽象路径名的哈希码。
boolean isAbsolute()
//测试此抽象路径名是否为绝对路径名。
boolean isDirectory()
//测试此抽象路径名表示的文件是否是一个目录。
boolean isFile()
//测试此抽象路径名表示的文件是否是一个标准文件。
boolean isHidden()
// 测试此抽象路径名指定的文件是否是一个隐藏文件。
long lastModified()
//返回此抽象路径名表示的文件最后一次被修改的时间。
long length()
//返回由此抽象路径名表示的文件的长度。
String[] list()
//返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
String[] list(FilenameFilter filter)
//返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。
File[] listFiles()
//返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
File[] listFiles(FileFilter filter)
//返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。
File[] listFiles(FilenameFilter filter)
//返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。
boolean mkdir()
//创建此抽象路径名指定的目录。
boolean mkdirs()
//创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
boolean renameTo(File dest)
//重新命名此抽象路径名表示的文件。
boolean setLastModified(long time)
//设置由此抽象路径名所指定的文件或目录的最后一次修改时间。
boolean setReadOnly()
//标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。
String toString()
//返回此抽象路径名的路径名字符串。
URI toURI()
//构造一个表示此抽象路径名的 file: URI。
URL toURL()
//将此抽象路径名转换成一个 file: URL。
3:对文件数据的操作—通过io流即可
向文件写入数据:
核心方法:
FileOutputStream out = this.openFileOutput("file_name",model);
常见model:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。最后别忘了关掉输出流!out.close();
从文件中读取数据:
核心方法
FileInputStream inStream =this.getContext().openFileInput("aa.txt");
//或者:
FileInputStream inStream =new FileInputStream("aa.txt");
获取相关目录:
Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<package name>/cache目录
getFilesDir()方法用于获取/data/data/<package name>/files目录
4:对sd卡的操作:
1:在andstudio中创建sdCARD;
2:加入权限:
在AndroidManifest.xml中加入访问SDCard的权限如下:
<!--在SDCard中创建与删除文件权限 -->
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--往SDCard写入数据权限 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3:sd卡状态的获取:
1:通过Environment.getExternalStorageState():用于获取SD卡状态;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// sd card 可用
}else {
// 当前不可用
}
常用的几种sd卡的状态:
Environment.MEDIA_MOUNTED // sd卡在手机上正常使用状态
Environment.MEDIA_UNMOUNTED // 用户手工到手机设置中卸载sd卡之后的状态
Environment.MEDIA_REMOVED // 用户手动卸载,然后将sd卡从手机取出之后的状态
Environment.MEDIA_BAD_REMOVAL // 用户未到手机设置中手动卸载sd卡,直接拨出之后的状态
Environment.MEDIA_SHARED // 手机直接连接到电脑作为u盘使用之后的状态
Environment.MEDIA_CHECKINGS // 手机正在扫描sd卡过程中的状态
4:sd卡状态监测:
:通过onStorageStateChanged:来监测sd卡状态的变化
public void onStorageStateChanged(String path, String oldState, String newState) {
if (newState.equals(Environment.MEDIA_SHARED)) {
//大容量存储时相关操作
} else if (newState.equals(Environment.MEDIA_CHECKING)) {
//检查sd卡时操作
} else if (newState.equals(Environment.MEDIA_MOUNTED)) {
//sd在手机上可用时操作
}elseif (...)
}
5:获取sd卡可用空间大小;
public long getSDFreeSize(){
//取得SD卡文件路径
File path = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(path.getPath());
//获取单个数据块的大小(Byte)
long blockSize = sf.getBlockSize();
//空闲的数据块的数量
long freeBlocks = sf.getAvailableBlocks();
//返回SD卡空闲大小
//return freeBlocks * blockSize; //单位Byte
//return (freeBlocks * blockSize)/1024; //单位KB
return (freeBlocks * blockSize)/1024 /1024; //单位MB
}
6:获取sd卡总共的大小
public long getSDAllSize(){
//取得SD卡文件路径
File path = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(path.getPath());
//获取单个数据块的大小(Byte)
long blockSize = sf.getBlockSize();
//获取所有数据块数
long allBlocks = sf.getBlockCount();
//返回SD卡大小
//return allBlocks * blockSize; //单位Byte
//return (allBlocks * blockSize)/1024; //单位KB
return (allBlocks * blockSize)/1024/1024; //单位MB
}
对sd卡的基本操作流程:
存:
1:检测sd卡是否存在;
2:获取sd卡可用空间;
3:获取输出流;
4:通过循环向文件写入数据;
5:关闭数据流;
取:
1:检测sd卡是否存在;
2:获取数据输出流;
3:获取数据;
4:关闭输出流;