您的位置:首页 > 移动开发 > Android开发

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

2016-04-07 11:55 609 查看
    在开发中,我们或多或少都会使用到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: