原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://mzh3344258.blog.51cto/1823534/746174admin管理员组文章数量:1564167
- package com.mzh.www;
- import java.io.File;
- import java.io.IOException;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Environment;
- /**
- * @Title: FileTestActivity.java
- * @Package com.mzh.www
- * @Description: 文件类File的常用方法
- * @author MZH
- * @version V2.2
- */
- public class FileTestActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //小马写的时候不带后缀名,其实这个要写的
- //而且安卓中不建议用此种写法,支持使用Environment获取路径
- String path = "/sdcard/fileName";
- File file = new File(path); //不多讲
- //下面是File类的一些静态属性
- //file.separator; 小马以前喜欢用"/",虽然不错,但不支持,接着看下面
- //举两种 写法:
- //方法一:
- String path2 = Environment.getExternalStorageDirectory()
- .getPath()
- +"/"+"XiaoMa.txt";
- File fileName = new File(path2);
- //此处可以添加对文件的操作,IO流
- //方法二:
- String path3 = Environment.getExternalStorageDirectory()
- .getPath()
- +File.separator+"XiaoMa.txt";
- File fileNam = new File(path3);
- //此处可以添加对文件的操作,IO流
- /**
- * 大家是不是发现这两种写法第二种多此一举?其实并非如此的
- *,在Android中,官方鼓励支持使用
- * File.separator来插入"/"符号
- * 因为:不同的机型配置系统等各种因素下,"/"符号的转义字符也会不同*
- *,所以为保险起见,
- * 建议朋友们使用File.separator来区别
- */
- //下面讲下文件的创建是怎么一回事
- //Android 中创建文件的方式有很多种,小马现在讲下
- //我们经常用到的几种哦,吼吼
- File file3 = new File("path"); //path为要创建文件的路径
- //,相关路径可查看API
- //创建一个临时文件
- //小马讲下,如果让我们自己创建临时文件时,我们还得拼接文件名
- //,Android为我们提供了更快捷的方式
- //prefix代表:文件名前缀,suffix代表:生成临时文件的格式,
- //如:.txt .amr .jpg .png等等
- try {
- //此处小马未指定路径,它会默认创建在SD卡根目录下
- File tempFile = File.createTempFile("前缀", "格式"); //记得加入try语句块中
- //如果想要指定路径,则可以这样写
- File tempFile2 = File.createTempFile("前缀", "格式",new File("指定临时文件路径"));
- } catch (IOException e) {
- e.printStackTrace();
- }
- //创建文件的方式有三种:要看仔细咯
- File file2 = new File(path3); //因为路径是自己指定的,
- //在此小马就直接合上面定义过的路径了
- if(!file2.exists()){
- //方式一:
- try {
- file2.createNewFile();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //方式二:
- //file2.mkdir();
- //方式三:
- //file2.mkdirs();
- /**
- * 以上创建文件方式好像也没多大不同之处,小马的的错误,
- *创建文件的时候随便调用这三个方法其中之一
- * 但后来发现还是有明显区别的,现在贴一段官方API说明
- *,小马英语也不咋的,希望英语一般的朋友们
- * 看到英语不要怕自己不会翻译什么的,多查单词,
- *不会的再求助工作翻译下,查可以提高自己的英语能力
- */
- /**
- * 小述:讲下“/”与“\”的不同,在创建文件时不能使用使用windows方式,
- *也就是"\",除非你转义有linux方式的话就直接用“/”,省了麻烦,
- *还不会出错转义错误等问题,对吧?
- */
- /**
- * createNewFile()
- Creates a new, empty file on the file system according to the path information
- stored in this file.
- 这个方法指在指定路径下创建一个empty(空的,小马就认识几个单词,
- *其余的都有道查)文件
- */
- /**
- * mkdir()
- Creates the directory named by the trailing filename of
- this file.
- 这个方法指:创建一个指定目录下的文件,但这个方法不能创建多个目录,
- 一般都使用加S的,这个尽量少用,一般私有文件
- 及私有目录的创建用这个方法
- */
- /**
- * mkdirs()
- Creates the directory named by the trailing filename of this file,
- including the complete directory path required to create this
- directory.
- 这个方法指:创建一个指定目录下的文件,与上面不同的是,
- 此方法可以创建多个目录哦,常用的创建文件的方法
- */
- /**
- * 最后,讲下isDirectory() 与 isFile()的小区别
- * 小马刚开始不懂什么是Directory,后来试了下,讲直接的,
- 就是:是否是文件夹,isFile是否是文件,简单吧??O_O
- */
- }
- }
- }
- <!--往sdcard中写入数据的权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
- <!--在sdcard中创建/删除文件的权限 -->
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
- /**
- * @Title: DeleteFile.java
- * @Description: 文件、文件夹操作类
- * @author MZH
- * @version 1.0 一般自己的工具辅助类,我个人习惯加版本号,得考虑到后期维护,方便标记
- */
- public class FileUtils{
- /**
- * 一般情况下,小马希望大家养成好习惯,构造方法,一般留个空的,方便扩展
- */
- public FileUtils(){
- }
- /**
- * 删除文件
- * @param file
- * @return
- */
- public boolean deleteFile(File file) {
- boolean result = false;
- if (file != null) {
- try {
- File file2 = file;
- file2.delete();
- result = true;
- } catch (Exception e) {
- e.printStackTrace();
- result = false;
- }
- }
- return result;
- }
- /**
- * 删除文件夹
- * @param folder
- * @return
- * 因为涉及到一个文件夹下有文件也有文件夹的情况,所以写个函数,以后直拿来用
- */
- public boolean deleteFolder(File folder) {
- boolean result = false;
- try {
- //取得文件下所有信息:包括文件及文件夹名称
- String childs[] = folder.list();
- //小马的错误:是字符串数组,没习惯判断length大小,希望朋友们不要忘了判断长度,养成好的习惯
- if (childs == null || childs.length <= 0) {
- if (folder.delete()) {
- result = true;
- }
- } else {
- for (int i = 0; i < childs.length; i++) {
- String childName = childs[i];
- String childPath = folder.getPath() + File.separator
- + childName;
- File filePath = new File(childPath);
- //小马的错误:只判断是否存在,未判断是文件还是文件夹,这样会漏掉一大
- //部分文件的操作,所以isFile一定要加
- if (filePath.exists() && filePath.isFile()) {
- if (filePath.delete()) {
- result = true;
- } else {
- result = false;
- break;
- }
- //如果是文件夹的操作,此及写递归删除,调用自己
- } else if (filePath.exists() && filePath.isDirectory()) {
- if (deleteFolder(filePath)) {
- result = true;
- } else {
- result = false;
- break;
- }
- }
- }
- folder.delete();
- }
- } catch (Exception e) {
- e.printStackTrace();
- result = false;
- }
- return result;
- }
- /**
- * 实现清空所有Temp文件
- *
- * @return 是否删除成功
- */
- private boolean deleteTempFiles() {
- //ApplicationData myApp = new ApplicationData();
- //这一步是小马犯的错误,因为继承Application的类是可以这样new对象,
- //但不建议直接new,多分内存,而且还是全局的,浪费
- //此处直接写getApplication会报错,因为需要上下文件,
- //所以这时小马说的扩展构造方法就有用了,可以在new本类对象时会了Context对象哦,吼吼
- //ApplicationData myApp = (ApplicationData)getApplication();
- FileUtils df = new FileUtils();
- File file = null;
- if (Environment.getExternalStorageState().equals(
- Environment.MEDIA_MOUNTED)) {
- //因为类似临时文件,一般都在最开始创建,最后删除,
- //所以小马把建议类似操作放在Application里面操作,取值操作都方便
- file = new File(TEMP); //TEMP为临时文件存放的文件夹路径
- }
- return df.deleteFolder(file);
- }
- /**
- * 保存时将临时文件夹下所有文件移至目标文件夹下
- * @param oldLocation 源文件夹
- * @param newLocation 目标文件夹
- * @throws IOException 异常
- * @throws NoSpaceIOException 磁盘空间不足 小马自定义的异常类,可以跳过
- */
- public void moveFile(File oldLocation, File newLocation)
- throws IOException, NoSpaceIOException {
- boolean isMkdirs = false;
- File file = new File(newLocation.getPath()+File.separator+"此处拼接文件名");
- if(!file.exists()){
- isMkdirs = file.mkdirs();
- if(isMkdirs){
- String childs[] = oldLocation.list();
- if(oldLocation != null && oldLocation.exists()){
- for(int i=0;i<childs.length;i++){
- String childName = childs[i];
- String childPath = oldLocation.getPath()+File.separator+childName;
- File filePath = new File(childPath);
- if(filePath.exists() && filePath.isFile()){
- FileInputStream fis = null;
- FileOutputStream fos = null;
- try {
- fis = new FileInputStream(filePath);
- //下面这句中的false是用来判断是否是append追加状态,
- //不懂的朋友们可以直接访问:http://developer.android/reference/java/io/File.html
- //来查看相关方法参数的具体涵义,吼吼
- fos = new FileOutputStream(new File(file.getPath()+File.separator+childName),false);
- byte[] buff = new byte[8192];
- int readIn ;
- //此处注意下:read方法中的参数如果不写的话,会读不到文件内容,
- //报异常,小马犯过的低级错误,希望你不要犯啦
- while((readIn = fis.read(buff,0,buff.length))!= -1){
- fos.write(buff,0,readIn);
- }
- fos.flush();
- } catch (Exception e) {
- e.printStackTrace();
- /*if (android.os.Environment.getExternalStorageState().equals(
- android.os.Environment.MEDIA_MOUNTED)) {
- // 如果有sdcard,磁盘空间是否满了
- Log.d(TAG, "DMUtils>>>sdcard is ok!");
- // No space left on device
- if (ex.getMessage() != null
- && ex.getMessage().indexOf(
- "No space left on device") != -1) {
- // 磁盘空间满
- throw new NoSpaceIOException(ex.getMessage());
- }
- } else {
- // 文件保存失败应该检查sd卡
- Log.d(TAG, "DMUtils>>>sdcard is error!state: "
- + android.os.Environment.getExternalStorageState());
- }
- throw new IOException(ex.getMessage()
- + " IOException when transferring "
- + oldLocation.getPath() + " to "
- + newLocation.getPath());*/
- }finally{
- //大伙应该很熟悉了吧?小马一朋友犯过的错误,未关闭流,
- //导致生成的文件本来是KB的却成了MB的文件,所以一定注意打开什么就关闭什么
- try {
- if(fis!=null){
- fos.close();
- }
- if(fos!=null){
- fos.close();
- }
- } catch (Exception e2) {
- e2.printStackTrace();
- }
- }
- }
- /*
- * 因为此处小马用的是一个文件夹下的文件操作,并不包含子文件夹,
- * 所以:如果有朋友要用子文件夹操作的话可激活此处递归处理哦
- */
- /*else if(filePath.exists() && filePath.isDirectory()){
- try {
- moveFile(filePath,new File("此处路径从全局文件中取就OK了"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }*/
- }
- }
- }
- }
- }
- }
版权声明:本文标题:Android文件操作File 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727468363a1115963.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论