从事Android开发也很长时间了,知识点多而杂,一直以来都想做个系统的整理和总结,心动不如行动。
做软件开发,不管什么系统下的,总是少不了文件的读写操作,就先从SDcard的文件读写操作开始吧。
1权限
读写SDcard自然是需要从系统那获取相应的许可的,就是权限。这个是第一步,没有这个什么都做不下去。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
读写SDcard的时候经常打交道的一个类就是Environment类,列一下常见静态方法:
2判断SDcard是否存在1:getDataDirectory() 获取到Android中的data数据目录(sd卡中的data文件夹) 2:getDownloadCacheDirectory() 获取到下载的缓存目录(sd卡中的download文件夹) 3:getExternalStorageDirectory() 获取到外部存储的目录 一般指SDcard(/storage/sdcard0) 4:getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,比较常用的应该是 MEDIA_MOUNTED(SDcard存在并且可以进行读写)还有其他的一些状态,可以在文档中进行查找。
5:getRootDirectory() 获取到Android Root路径
这个也是先决条件,很多初学者会忘记的。
/** * 判断sd卡是否存在,[当没有外挂SD卡时,内置ROM也被识别为存在sd卡] * @return */ private static boolean isExitSDcard(){ boolean isExit; isExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); return isExit; }
这里又有Environment类里的常量了,我总结了一下,在这里列出来供大家参考
MEDIA_BAD_REMOVAL 在没有挂载前存储媒体已经被移除。
MEDIA_CHECKING 正在检查存储媒体。
MEDIA_MOUNTED 存储媒体已经挂载,并且挂载点可读/写。
MEDIA_MOUNTED_READ_ONLY 存储媒体已经挂载,挂载点只读。
MEDIA_NOFS 存储媒体是空白或是不支持的文件系统。
MEDIA_REMOVED 存储媒体被移除。
MEDIA_SHARED 存储媒体正在通过USB共享。
MEDIA_UNMOUNTABLE 存储媒体无法挂载。
MEDIA_UNMOUNTED 存储媒体没有挂载。
在Environment中还提供了Android标准目录的路径,以String类型提供。
DIRECTORY_ALARMS 系统提醒铃声存放的标准目录。
DIRECTORY_DCIM 相机拍摄照片和视频的标准目录。
DIRECTORY_DOWNLOADS 下载的标准目录。
DIRECTORY_MOVIES 电影存放的标准目录。
DIRECTORY_MUSIC 音乐存放的标准目录。
DIRECTORY_NOTIFICATIONS 系统通知铃声存放的标准目录。
DIRECTORY_PICTURES 图片存放的标准目录
DIRECTORY_PODCASTS 系统广播存放的标准目录。
DIRECTORY_RINGTONES 系统铃声存放的标准目录。
3获取路径和创建文件,文件夹
1)获取常用的路径,一般开发者这两种路径常用到
//SD卡的路径
SDPATH = Environment.getExternalStorageDirectory().getPath();
//当前程序包的路径 FILESPATH = this.getFilesDir().getPath();
2)创建文件夹,文件
private final static String PATH = "/sdsd/talk/tehst.txt"; private final static String PATH1 = "/sdsd/talk/";//创建文件夹
File file1 = new File(SDPATH+PATH1); if (!file1.exists()){ file1.mkdirs(); }
//创建文件 File file = new File(SDPATH + PATH); if (!file.exists()) { file.createNewFile(); }3)删除文件
//单个
public boolean deleteSDFile(String fileName) { File file = new File(SDPATH + fileName); if (file == null || !file.exists() || file.isDirectory()) return false; return file.delete(); }//目录下的
public void deleteFile(File file) { if (file.exists()) { // 判断文件是否存在 if (file.isFile()) { // 判断是否是文件 file.delete(); } else if (file.isDirectory()) { // 否则如果它是一个目录 File files[] = file.listFiles(); // 声明目录下所有的文件 files[]; for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件 this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代 } } file.delete(); } else { // Log.i("文件不存在!"+"\n"); } }
//删除目录下的所有文件及文件夹
public static void delete(File file) {
if (file.isFile()) {
file.delete();
return;
}
if(file.isDirectory()){
File[] childFiles = file.listFiles();
if (childFiles == null || childFiles.length == 0) {
file.delete();
return;
}
for (int i = 0; i < childFiles.length; i++) {
delete(childFiles[i]);
}
file.delete();
}
}
4)文件的读写
闲话少说,直接上代码
FileOutputStream写入文件
/** * 写入内容到SD卡中的txt文本中 * str为内容 */ public void writeSDFile(String str,String fileName) { try { FileWriter fw = new FileWriter(SDPATH + fileName); File f = new File(SDPATH + fileName); fw.write(str); FileOutputStream os = new FileOutputStream(f); DataOutputStream out = new DataOutputStream(os); out.writeShort(2); out.writeUTF(""); S