Android File(一) 存储以及File操作介绍

    在开发中,我们或多或少都会使用到File操作,例如,下载图片、资源包、apk等等。那么接下来,我们就看看有关File的一些具体操作。

一.存储说明。

1.在Android中,我们保存数据到手机上,基本上有两种选择,一种是手机内部存储,另一种是外部存储。

(1).手机内部存储(ROM),并不是我们平时所说的手机内存(RAM),它比手机内存要大很多,手机内部存储是手机制造商在手机出厂时,已经确定好的,一旦出厂时无法改变的,例如,介绍手机的时候说16G,32G就是这个内部存储大小(当我们打开手机查看可用空间时,会发现少了几个G,这是因为系统以及其他资源占用了)。我们比较熟悉的目录是,目录1-‘/data/data/应用程序包名’(要看到该目录,手机需要root),手机app的Sqlite数据库、Shared Preferences、WebView的缓存等都是在该目录中,该目录是系统目录,每当有应用安装后,便会在该目录中创建相应的数据。由于内部存储的大小是确定的,所以,我们在使用时避免在内部存储中大量存储数据。

(2).外部存储,就是我们经常说的,可扩展的存储,例如SD卡、TF卡、TS卡。我们可以在外部存储中,存储各种数据,只要我们的外部存储够大。但是,外部存储不太稳定,当你挂载的时候,可能就用不了了,或者其他原因,总之外部存储在使用前,需要判断外部存储的状态是否可用。我们所熟知的外部存储目录,目录2-‘/sdcard/Android/data/应用程序包名’,该目录是系统创建的,谷歌建议,我们在外部存储时,最好能在该目录下存储。因为当我们在卸载某个应用时,默认情况下,目录1和目录2底下的数据才会自动清除,在其他地方创建的文件或者文件夹,需要手动清除才可以。当然,外部存储对数据的保护较少,所以,建议一些重要的、敏感的数据不应该保存到外部存储中。如果这些数据加密的话,可以选择保存在外部存储。

二.File操作。

1.常用方法。

//建立文件
File.createNewFile();
//建立文件夹 
File.mkDir(); 
//判断是否是文件
File.isFile();
//判断是否是文件夹 
File.isDirectory(); 
//列出文件夹下的所有文件和文件夹名
File[] files = File.listFiles();   
//重命名文件或文件夹  
File.renameTo(dest);  
//删除文件夹或文件
File.delete(); 
//获得文件或文件夹的名称   
String Name = File.getName(); 
//获得文件或文件夹的父目录  
String parentPath = File.getParent();  
//获得文件或文件夹的绝对路经 
String path = File.getAbsoultePath(); 
//获得文件或文件夹的路经
String path = File.getPath();
//获得sd卡根目录
File skRoot = Environment.getExternalStorageDirectory();

2.其他常用方法。

 /**
	 * 判断SD卡是否被挂载
	 * 
	 * @return
	 */
	public static boolean isSDCardMounted() {
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
	}

	/**
	 * 获取SD卡的根目录
	 * 
	 * @return
	 */
	public static String getSDCardBaseDir() {
		if (isSDCardMounted()) {
			return Environment.getExternalStorageDirectory().getAbsolutePath();
		}
		return null;
	}

	/**
	 * 获取sd卡的大小
	 * 
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static long getSDAllSizeKB() {
		if (isSDCardMounted()) {
			// get path of sdcard
			File path = Environment.getExternalStorageDirectory();
			StatFs sf = new StatFs(path.getPath());
			// get single block size(Byte)
			long blockSize = sf.getBlockSize();
			// 获取所有数据块数
			long allBlocks = sf.getBlockCount();
			// 返回SD卡大小
			return (allBlocks * blockSize) / 1024; // KB
		}
		return 0;
	}

	/**
	 * 获取sd卡可用大小
	 * 
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static long getSDAvalibleSizeKB() {
		if (isSDCardMounted()) {
			File path = Environment.getExternalStorageDirectory();
			StatFs sf = new StatFs(path.getPath());
			long blockSize = sf.getBlockSize();
			long avaliableSize = sf.getAvailableBlocks();
			return (avaliableSize * blockSize) / 1024;// KB
		}
		return 0;
	}

	/**
	 * 获取文件或文件夹的大小
	 * 
	 * @param path
	 *            文件或文件夹的路径
	 * @return
	 */
	public static long getFileSize(String path) {
		return getFileSize(new File(path));
	}

	/**
	 * 获取文件或文件夹的大小
	 * 
	 * @param file
	 *            文件或文件夹
	 * @return
	 */
	public static long getFileSize(File file) {
		if (file.exists()) {
			if (file.isDirectory()) {
				long size = 0;
				for (File subFile : file.listFiles()) {
					size += getFileSize(subFile);
				}
				return size;
			} else {
				return file.length();
			}
		} else {
			throw new IllegalArgumentException("File does not exist!");
		}
	}

	/**
	 * 删除文件或文件夹
	 * 
	 * @param path
	 *            文件或文件夹的路径
	 */
	public static void deleteFile(String path) {
		deleteFile(new File(path));
	}

	/**
	 * 删除文件或文件夹
	 * 
	 * @param file
	 *            文件或文件夹
	 */
	public static void deleteFile(File file) {
		if (!file.exists()) {
			Log.d("The file to be deleted does not exist! File's path is: ",
					file.getPath());
		} else {
			deleteFileRecursively(file);
		}
	}

	/**
	 * 删除文件或文件夹
	 * 
	 * @param file
	 *            文件或文件夹
	 */
	private static void deleteFileRecursively(File file) {
		if (file.isDirectory()) {
			for (String fileName : file.list()) {
				File item = new File(file, fileName);
				if (item.isDirectory()) {
					deleteFileRecursively(item);
				} else {
					if (!item.delete()) {
						Log.d("Failed in recursively deleting a file, file's path is: ",
								item.getPath());
					}
				}
			}
			if (!file.delete()) {
				Log.d("Failed in recursively deleting a directory, directories' path is: ",
						file.getPath());
			}
		} else {
			if (!file.delete()) {
				Log.d("Failed in deleting this file, its path is: ",
						file.getPath());
			}
		}
	}

PS:在操作SD卡时,记得在AndroidManifest.xml加入以下权限

<!--在SDCard中创建与删除文件权限 -->

<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!--往SDCard写入数据权限 -->

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

三.总结

   在File操作中,我们需要注意的是,操作完成后,File是否还需要,如果不需要,那么就立刻删除掉,这样也许你的应用会更受欢迎!在 Android File(二) File下载以及解压,这篇文章中我们介绍了有关下载压缩包以及解压。

PS:

Context.getExternalCacheDir().getPath(); 获取到的是 /sdcard/Android/data/<application package>/cache 这个路径 -目录2
Context.getCacheDir().getPath();  获取到的是 /data/data/<application package>/cache 这个路径-目录1


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值