Android的存储系统有三种:
RAM(运行内存,手机断电后数据会丢失),
ROM 就相当于我们电脑的C盘,是手机自带的存储空间,ROM中安装了操作系统的所有东西,我们所说的刷机一般就是刷ROM,而且一般默认的软件安装都是放在这里的,如果不是因为ROM空间不足,最好不要把程序装在SD卡上。因为ROM的读写速度比SD卡快。
SD卡 也就是我们的外部存储。
使用上我们通过android.os.Environment来获得其路径。
File file=Environment.getRootDirector(); //得到系统根目录,
file.getAbsolutePath(); //得到系统根目录的路径。
得到的是 /system
File file1=Environment.getDataDirectroy(); //得到ROM目录
file2.getAbsolutePath(); //得到ROM目录的路径。
得到的是 /data
data文件夹是android中一个非常重要的文件夹,所以一般权限是无法获取到文件的。
FIle file3=Environment.getExteralStorageDirectroy(); //得到外部存储的目录
file3.getAbsolutePath(); //得到外部存储的目录的路径。
要获取SD卡首先要先确定SD卡是否装载
boolean is=Environment.getExteralStorageState().equals(Environment.MEDIA_MOUNTED);
如果为true,则表示已装载。其次我们在SD卡中创建文件和读写文件,需要相应的权限。
<!-- 在SD卡中创建和删除文件的权限--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 在SD卡中写入数据的权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android默认是无法直接操作Data根目录的,只能直接读写程序直接的私有目录,也就是/data/data/Package name/files那什么时候可以直接读写/data呢?当你的APP取得了超级权限,也就系统ROOT之后,那样你的app就是应用级别的了。还需要修改mk文件中的属性为LOCAL_CERTIFICATE :=platform
File file=Context.getFilesDir(); //获得私有文件的目录
file.getAbsolutePath(); //获得私有文件的目录路径
得到的是 /data/data/com.example/testenvironment/files 通用的形式是 /data/data/包/files
我们如果在ROM中存储文件,可以在files目录下创建文件夹和文件来存储数据。
在根据路径(以参数形式传入)创建目录或文件时,需要使用到String.split函数。
函数原型:
public String[] split(String regex,int limit) 根据给定的正则表达式来拆分此字符串。
limit 拆分的次数,最终影响的是数组的长度。
如果limit大于0,那么拆分次数最多为limit-1,且数组长度不会大于limit。
如果limit为非正,那么拆分至不能再拆分为止,数组长度不受限.
如果limit=0,那么拆分至不能再拆分为止,但是要将数组尾部的空字符去掉。
例如:“boo:and:foo”
参数: “o” 1 最多进行0次拆分,那么就是原始字符串了,输出“boo:and:foo”
参数: “o” 2 最多进行1次拆分,输出”b“,“o:and:foo”
参数: “o” 5 最多进行4次拆分,输出“b”,“”,“:and:f”,"",""
参数: “o” -2 最大拆分次数,输出“b”,“”,“:and:f”,"",""
参数: “o” 0 最大拆分次数,去掉尾部空字符 “b”,“”,“:and:f”
函数原型:
public String[] split(String regex) 上面limit=0情况下的调用。
在整个Android应用开发中,我们的一些数据,如图片,服务器端发来的数据需要缓存或保存到本地中,可以保存到ROM也可保存到SD卡中。我们需要经常访问ROM或SD卡,在其中创建目录或文件来存放数据。下面我封装了在ROM/SD卡中创建目录/文件,并在其中保存数据的方法库。
public class FileUtil { /** * 在ROM目录下创建文件 * 绝对路径(header)不存在会抛出异常 * @Param header * 绝对路径,包括私有文件根路径,如/data/data/com.testenvironment/files/meme,/meme是自己创建的存放该app数据的目录 * 整个app使用的绝对路径是一样的,即在/data/data/PackageName/files下创建一个文件夹,该目录需要是存在的,不存在的话,先创建文件夹 * @Param tail * 相对路径,存放文件的目录,首尾不含/,如 pictures/icon/fileName * @throws IOException */ public static void createFileOnRom(String header, String tail) throws IOException { //获得绝对路径目录,该目录需要是存在,不存在会抛出异常,需要提前创建 File file=new File(header); if(!file.exists()){ throw new IOException("The Header Path not exist!"); } //遍历创建不存在的文件夹 String[] sub=tail.split("/"); String str=header; for(int i=0;i<sub.length-1;i++){ str=str+"/"+sub[i]; File f=new File(str); if(!f.exists()){ f.mkdir(); } } //创建最终的文件 str=str+"/"+sub[sub.length-1]; File f=new File(str); if(!f.exists()){ f.createNewFile(); } } /** * 在SD卡中创建文件 * 绝对路径(header)不存在会抛出异常 * @param header * 绝对路径,包括SD卡根路径,如/storage/emulated/0/meme,/meme自己创建的存放该app数据的目录 * @param tail * 相对路径,存放文件的目录,首尾 /,如pictures/icon/fileName * @throws IOException */ public static void createFileOnSD(String header, String tail) throws IOException { //判断是否装载SD卡 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //绝对路径必须存在 File file=new File(header); if(!file.exists()){ throw new IOException("The Header Path not exist!"); } //遍历创建不存在文件夹 String[] sub=tail.split("/"); String str=header; for(int i=0;i<sub.length-1;i++){ str=str+"/"+sub[i]; File f=new File(str); if(!f.exists()){ f.mkdir(); } } //创建最终的文件 str=str+"/"+sub[sub.length-1]; File f=new File(str); if(!f.exists()){ f.createNewFile(); } } } /** * 在ROM目录下创建文件夹 * @throws IOException * * @Param header * 绝对路径,包括私有文件根路径,如/data/data/com.testenvironment/files/meme,/meme是自己创建的存放该app数据的目录 * 整个app使用的绝对路径是一样的,即在/data/data/PackageName/files下创建一个文件夹,该目录需要时存在的,不存在的话,先创建 * @Param tail * 相对路径,存放文件的目录,首尾不含/,如 pictures/icon/dirName */ public static void mkDirOnRom(String header, String tail) throws IOException{ //获得绝对路径目录,必须是存在的 File file=new File(header); if(!file.exists()){ throw new IOException("The Header Path not exist!"); } //遍历创建不存在的文件夹 String[] sub=tail.split("/"); String str=header; for(int i=0;i<sub.length;i++){ str=str+"/"+sub[i]; File f=new File(str); if(!f.exists()){ f.mkdir(); } } } /** * 在SD卡上创建文件夹 * * @param header * 绝对路径,包括sd卡的根路径,如/storage/emulated/0/meme, * /meme是自己创建的存放该app数据的目录 * @param tail * 相对路径,存放文件的目录,首尾不含/,如pictures/icon/dirName * @throws IOException */ public static void mkDirOnSD(String header, String tail) throws IOException{ //判断是否装载SD卡 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //绝对路径header必须存在 File file=new File(header); if(!file.exists()){ throw new IOException("The Header Path not exist!"); } //遍历创建不存在的文件夹 String[] sub=tail.split("/"); String str=header; for(int i=0;i<sub.length;i++){ str=str+"/"+sub[i]; File f=new File(str); if(!f.exists()){ f.mkdir(); } } } } /** * 将数据存储到ROM的文件中 * * @param romPath ROM存储文件路径 * @param b 字符串字节数组 * @throws IOException * */ public static void saveToRomFile(String romPath,byte[] b) throws IOException{ if(romPath.trim().equals("")){ throw new IOException("Path not exist"); } File file=new File(romPath); if(!file.exists()){ throw new IOException("file not exist"); } OutputStream out=new FileOutputStream(file); out.write(b); out.close(); } /** * 将数据存储到SD卡的文件中 * * @param sdPath SD存储文件路径 * @param b 字符串字节数组 * @throws IOException * */ public static void saveToSDFile(String sdPath,byte[] b) throws IOException{ if(sdPath.trim().equals("")){ throw new IOException("Path not exist"); } //判断是否装载SD卡 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //检测文件是否存在,不存在抛出异常 File file=new File(sdPath); if(!file.exists()){ throw new IOException("file not exist"); } OutputStream out=new FileOutputStream(file); out.write(b); out.close(); } } public static void readFormFile(String sdPath, String romPath) throws IOException { // 路径判空 if (sdPath.trim().equals("") || romPath.trim().equals("")) { return; } File file = null; // SD是否装载 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 创建存储文件 file = new File(sdPath); if (file.exists()) { InputStream in = new FileInputStream(file); int len = 0; byte[] buffer = new byte[1024]; StringBuffer str = new StringBuffer(); while ((len = in.read(buffer)) != -1) { str.append(new String(buffer)); } Log.i("TAG", str.toString()); in.close(); } } //读取ROM file = new File(romPath); if (file.exists()) { InputStream in = new FileInputStream(file); int len = 0; byte[] buffer = new byte[1024]; StringBuffer str = new StringBuffer(); while ((len = in.read(buffer)) != -1) { str.append(new String(buffer)); } Log.i("TAG", str.toString()); in.close(); } } }