Andorid存储目录知识总结及文件操作方法封装

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();
		}

	}
}

时间: 2024-10-11 11:31:11

Andorid存储目录知识总结及文件操作方法封装的相关文章

Linux基础知识--Linux的文件系统和bash的基础特性

Linux基础知识--linux的文件系统和bash的基础特性 一.Linux文件系统: Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中 linux文件系统遵循FHS(Filesystem Hierarchy Standard,文件系统目录标准),多数Linux版本采用这种文件组织形式.FHS采用了树行组织文件. FHS定义了两层规范,第一层是,/目录下面的各个目录应该要

Linux文件系统详解(文件系统层次、分类、存储结构、存储介质、文件节点inode)

从操作系统的角度详解Linux文件系统层次.文件系统分类.文件系统的存储结构.不同存储介质的区别(RAM.ROM.Flash).存储节点inode. 本文参考:http://blog.chinaunix.net/uid-8698570-id-1763151.html http://www.iteye.com/topic/816268 http://soft.chinabyte.com/os/142/12315142.shtml http://www.ibm.com/developerworks/

一篇文章搞懂android存储目录结构

前言 前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安装不了,提示解析包出错.后来查询发现,安装apk是调用了PackageInstaller,没有相关权限,这个无法获取内部路径,所以会安装不了.借机也复习了一遍Android下面存储相关的知识点,特来总结一番. 存储分类 对于Android存储目录,我总结成一张思维导图,如果有需要原图的,请在我的公众

etc目录下的重要文件

总结etc目录下的重要文件 1) 网卡配置文件 文件路径信息: /etc/sysconfig/network-scripts/ifcfg-eth0 文件作用说明: 配置网卡地址信息 (IP地址 掩码地址 网关地址 DNS地址信息) 文件详细信息: TYPE=Ethernet --- 指定网络类型 以太网类型 BOOTPROTO=none --- 获取IP地址方式 none static(手动配置地址) dhcp(自动获取地址) DEFROUTE=yes --- 是否激活默认?路由? (网络知识)

删除一个目录下的所有文件,但保留一个指定文件

此题问题虽小,但是初学者还是很难给出合理的答案的!本文来自老男孩21期网络班学员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10  十个文件

android 62 手机存储目录的划分

android下应用程序的路径和javase不同,应用程序的数据要保存自己的文件夹里面 > > getFileDir(); 获取自己的文件夹 /data/data/包名(应用程序的名字)/files > getCacheDir(); /data/data/包名(应用程序的名字)/cache 谷歌给我们提供了两种应用程序的目录,files目录存放重要的应用程序数据.手机不会自动清理files目录的文件,比如配置信息,软件的清除数据就是清除这里. cache目录是存放临时的不重要的数据.这个

文件操作方法fscanf

直入主题,首先把经典方法放在前面: 如下情况大量有规律的数据存储在文件中格式化的读取方法: Almond #EED9C4 Antique Brass #C88A65 Apricot #FDD5B1 Aquamarine #71D9E2 Asparagus #7BA05B ............................. 先上代码: 1 FILE *fp; //定义文件指针 2 char a[20]={0}; //定义两个数组来接受数据 3 char b[20]={0}; 4 5 fp=

查找目录下的所有文件中是否含有某个字符串 linux

查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l 1.正则表达式    (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成.   (2)基本元字符集及其含义       ^ :只匹配行首.   如^a 匹配以a开头的行abc,

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" find .|xargs grep -ri "IBM" -l \ :只用来屏蔽一个元字符的特殊含义. 如\*,\',\",\|,\+,\^,\. 等       .:(点)只匹配任意单字符.       pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数.如a\{2\}匹配aa.       pattern\{n,\}:含义同上,但次数