Android文件操作File

来源:互联网 发布:ps4全境封锁网络设置 编辑:程序博客网 时间:2024/05/17 00:03
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mzh3344258.blog.51cto.com/1823534/746174

        今天小马来写下自己的开发过程中碰到的问题和所犯的错,虽然简单,但还是希望通过总结提高自己,哪怕很小的进步,也希望朋友们跟小马多交流,指点小马的不足,多批评小马,有很多东西要学,我们多多交流,共同进步,直接看代码:

 

  1. package com.mzh.www; 
  2.  
  3. import java.io.File; 
  4. import java.io.IOException; 
  5.  
  6. import android.app.Activity; 
  7. import android.os.Bundle; 
  8. import android.os.Environment; 
  9.  
  10. /**   
  11. * @Title: FileTestActivity.java 
  12. * @Package com.mzh.www 
  13. * @Description: 文件类File的常用方法 
  14. * @author MZH 
  15. * @version V2.2 
  16. */ 
  17. public class FileTestActivity extends Activity { 
  18.     /** Called when the activity is first created. */ 
  19.     @Override 
  20.     public void onCreate(Bundle savedInstanceState) { 
  21.         super.onCreate(savedInstanceState); 
  22.         setContentView(R.layout.main); 
  23.          
  24.          
  25.         //小马写的时候不带后缀名,其实这个要写的 
  26.         //而且安卓中不建议用此种写法,支持使用Environment获取路径 
  27.         String path = "/sdcard/fileName";  
  28.         File file = new File(path); //不多讲 
  29.          
  30.          
  31.         //下面是File类的一些静态属性 
  32.         //file.separator;    小马以前喜欢用"/",虽然不错,但不支持,接着看下面 
  33.          
  34.          
  35.         //举两种 写法: 
  36.               //方法一: 
  37.               String path2 = Environment.getExternalStorageDirectory()
  38. .getPath() 
  39.                              +"/"+"XiaoMa.txt"
  40.               File fileName = new File(path2); 
  41.               //此处可以添加对文件的操作,IO流 
  42.                
  43.                
  44.               //方法二: 
  45.               String path3 = Environment.getExternalStorageDirectory()
  46. .getPath() 
  47.                              +File.separator+"XiaoMa.txt"
  48.               File fileNam = new File(path3); 
  49.               //此处可以添加对文件的操作,IO流 
  50.          
  51.                
  52.               /** 
  53.                * 大家是不是发现这两种写法第二种多此一举?其实并非如此的
  54. *,在Android中,官方鼓励支持使用 
  55.                * File.separator来插入"/"符号 
  56.                * 因为:不同的机型配置系统等各种因素下,"/"符号的转义字符也会不同*
  57. *,所以为保险起见, 
  58.                * 建议朋友们使用File.separator来区别 
  59.                */ 
  60.            
  61.                
  62.               //下面讲下文件的创建是怎么一回事 
  63.               //Android 中创建文件的方式有很多种,小马现在讲下
  64. //我们经常用到的几种哦,吼吼 
  65.               File file3 = new File("path"); //path为要创建文件的路径
  66. //,相关路径可查看API 
  67.                
  68.                
  69.               //创建一个临时文件 
  70.               //小马讲下,如果让我们自己创建临时文件时,我们还得拼接文件名
  71. //,Android为我们提供了更快捷的方式 
  72.               //prefix代表:文件名前缀,suffix代表:生成临时文件的格式,
  73. //如:.txt .amr .jpg .png等等 
  74.               try { 
  75.                  //此处小马未指定路径,它会默认创建在SD卡根目录下 
  76.                 File tempFile = File.createTempFile("前缀""格式"); //记得加入try语句块中 
  77.                  
  78.                 //如果想要指定路径,则可以这样写 
  79.                 File tempFile2  = File.createTempFile("前缀""格式",new File("指定临时文件路径")); 
  80.               } catch (IOException e) { 
  81.                 e.printStackTrace(); 
  82.               }  
  83.                
  84.                
  85.               //创建文件的方式有三种:要看仔细咯 
  86.                    
  87.                   File file2 = new File(path3);  //因为路径是自己指定的,
  88. //在此小马就直接合上面定义过的路径了 
  89.                   if(!file2.exists()){ 
  90.                        
  91.                        //方式一: 
  92.                       try { 
  93.                         file2.createNewFile(); 
  94.                        } catch (IOException e) { 
  95.                         // TODO Auto-generated catch block 
  96.                         e.printStackTrace(); 
  97.                        } 
  98.                        
  99.                       //方式二: 
  100.                       //file2.mkdir(); 
  101.                        
  102.                       //方式三: 
  103.                       //file2.mkdirs(); 
  104.                        
  105.                       /** 
  106.                        * 以上创建文件方式好像也没多大不同之处,小马的的错误,
  107. *创建文件的时候随便调用这三个方法其中之一 
  108.                        * 但后来发现还是有明显区别的,现在贴一段官方API说明
  109. *,小马英语也不咋的,希望英语一般的朋友们 
  110.                        * 看到英语不要怕自己不会翻译什么的,多查单词,
  111. *不会的再求助工作翻译下,查可以提高自己的英语能力 
  112.                        */ 
  113.                        
  114.                        
  115.                        
  116.                       /** 
  117.                        * 小述:讲下“/”与“\”的不同,在创建文件时不能使用使用windows方式,
  118. *也就是"\",除非你转义有linux方式的话就直接用“/”,省了麻烦,
  119. *还不会出错转义错误等问题,对吧? 
  120.                        */ 
  121.                        
  122.                        
  123.                      /** 
  124.                       * createNewFile() 
  125.                         Creates a new, empty file on the file system according to the path information  
  126.                         stored in this file. 
  127.                         这个方法指在指定路径下创建一个empty(空的,小马就认识几个单词,
  128. *其余的都有道查)文件  
  129.                       */ 
  130.                        
  131.                     /** 
  132.                      * mkdir() 
  133.                        Creates the directory named by the trailing filename of
  134.  this file. 
  135.                              这个方法指:创建一个指定目录下的文件,但这个方法不能创建多个目录,
  136. 一般都使用加S的,这个尽量少用,一般私有文件 
  137.                              及私有目录的创建用这个方法 
  138.                      */ 
  139.                        
  140.                      
  141.                      /** 
  142.                       * mkdirs() 
  143.                         Creates the directory named by the trailing filename of this file,  
  144.                         including the complete directory path required to create this
  145.  directory. 
  146.                         这个方法指:创建一个指定目录下的文件,与上面不同的是,
  147. 此方法可以创建多个目录哦,常用的创建文件的方法 
  148.                       */ 
  149.                        
  150.                       /** 
  151.                        * 最后,讲下isDirectory() 与  isFile()的小区别 
  152.                        * 小马刚开始不懂什么是Directory,后来试了下,讲直接的,
  153. 就是:是否是文件夹,isFile是否是文件,简单吧??O_O 
  154.                        */ 
  155.                        
  156.                        
  157.                        
  158.                     
  159.                        
  160.                   } 
  161.                
  162.     } 

    最后,不要忘记加Android中文件操作的权限:

 

  1. <!--往sdcard中写入数据的权限 --> 
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
  3.  <!--在sdcard中创建/删除文件的权限 --> 
  4.  

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

批量文件的操作及单个文件的操作,不多废话,直接看代码:

 

 

  1. /** 
  2.  * @Title: DeleteFile.java 
  3.  * @Description: 文件、文件夹操作类 
  4.  * @author MZH 
  5.  * @version 1.0  一般自己的工具辅助类,我个人习惯加版本号,得考虑到后期维护,方便标记 
  6.  */ 
  7. public class FileUtils{ 
  8.  
  9.      
  10.     /** 
  11.      * 一般情况下,小马希望大家养成好习惯,构造方法,一般留个空的,方便扩展 
  12.      */ 
  13.     public FileUtils(){ 
  14.          
  15.     } 
  16.      
  17.      
  18.     /** 
  19.      * 删除文件 
  20.      * @param file 
  21.      * @return 
  22.      */ 
  23.     public boolean deleteFile(File file) { 
  24.         boolean result = false
  25.         if (file != null) { 
  26.             try { 
  27.                 File file2 = file; 
  28.                 file2.delete(); 
  29.                 result = true
  30.             } catch (Exception e) { 
  31.                 e.printStackTrace(); 
  32.                 result = false
  33.             } 
  34.         } 
  35.         return result; 
  36.     } 
  37.  
  38.     /** 
  39.      *  删除文件夹 
  40.      * @param folder   
  41.      * @return 
  42.      * 因为涉及到一个文件夹下有文件也有文件夹的情况,所以写个函数,以后直拿来用 
  43.      */ 
  44.     public boolean deleteFolder(File folder) { 
  45.         boolean result = false
  46.         try { 
  47.             //取得文件下所有信息:包括文件及文件夹名称 
  48.             String childs[] = folder.list(); 
  49.   //小马的错误:是字符串数组,没习惯判断length大小,希望朋友们不要忘了判断长度,养成好的习惯 
  50.             if (childs == null || childs.length <= 0) {   
  51.                 if (folder.delete()) { 
  52.                     result = true
  53.                 } 
  54.             } else { 
  55.                 for (int i = 0; i < childs.length; i++) { 
  56.                     String childName = childs[i]; 
  57.                     String childPath = folder.getPath() + File.separator 
  58.                             + childName; 
  59.                     File filePath = new File(childPath); 
  60. //小马的错误:只判断是否存在,未判断是文件还是文件夹,这样会漏掉一大
  61. //部分文件的操作,所以isFile一定要加 
  62.                     if (filePath.exists() && filePath.isFile()) {
  63.                         if (filePath.delete()) { 
  64.                             result = true
  65.                         } else { 
  66.                             result = false
  67.                             break
  68.                         } 
  69.                         //如果是文件夹的操作,此及写递归删除,调用自己 
  70.                     } else if (filePath.exists() && filePath.isDirectory()) { 
  71.                         if (deleteFolder(filePath)) { 
  72.                             result = true
  73.                         } else { 
  74.                             result = false
  75.                             break
  76.                         } 
  77.                     } 
  78.                 } 
  79.                 folder.delete(); 
  80.             } 
  81.         } catch (Exception e) { 
  82.             e.printStackTrace(); 
  83.             result = false
  84.         } 
  85.         return result; 
  86.     } 
  87.  
  88.     /** 
  89.      * 实现清空所有Temp文件 
  90.      *  
  91.      * @return 是否删除成功 
  92.      */ 
  93.     private boolean deleteTempFiles() { 
  94.         //ApplicationData myApp = new ApplicationData();   
  95. //这一步是小马犯的错误,因为继承Application的类是可以这样new对象,
  96. //但不建议直接new,多分内存,而且还是全局的,浪费 
  97.          
  98.         //此处直接写getApplication会报错,因为需要上下文件,
  99. //所以这时小马说的扩展构造方法就有用了,可以在new本类对象时会了Context对象哦,吼吼 
  100.         //ApplicationData myApp = (ApplicationData)getApplication(); 
  101.          
  102.         FileUtils df = new FileUtils(); 
  103.         File file = null
  104.         if (Environment.getExternalStorageState().equals( 
  105.                 Environment.MEDIA_MOUNTED)) { 
  106.             //因为类似临时文件,一般都在最开始创建,最后删除,
  107. //所以小马把建议类似操作放在Application里面操作,取值操作都方便 
  108.             file = new File(TEMP); //TEMP为临时文件存放的文件夹路径 
  109.         } 
  110.         return df.deleteFolder(file); 
  111.     } 
  112.  
  113.      
  114.     /** 
  115.      * 保存时将临时文件夹下所有文件移至目标文件夹下 
  116.      * @param oldLocation  源文件夹 
  117.      * @param newLocation  目标文件夹 
  118.      * @throws IOException  异常 
  119.      * @throws NoSpaceIOException  磁盘空间不足 小马自定义的异常类,可以跳过 
  120.      */ 
  121.     public void moveFile(File oldLocation, File newLocation) 
  122.             throws IOException, NoSpaceIOException { 
  123.         boolean isMkdirs = false
  124.         File file = new File(newLocation.getPath()+File.separator+"此处拼接文件名"); 
  125.         if(!file.exists()){ 
  126.             isMkdirs = file.mkdirs(); 
  127.             if(isMkdirs){ 
  128.                 String childs[] = oldLocation.list(); 
  129.                 if(oldLocation != null && oldLocation.exists()){ 
  130.                     for(int i=0;i<childs.length;i++){ 
  131.                         String childName = childs[i]; 
  132.                         String childPath = oldLocation.getPath()+File.separator+childName; 
  133.                         File filePath = new File(childPath); 
  134.                         if(filePath.exists() && filePath.isFile()){ 
  135.                             FileInputStream fis = null
  136.                             FileOutputStream fos = null
  137.                             try { 
  138.                                 fis = new FileInputStream(filePath); 
  139.                                 //下面这句中的false是用来判断是否是append追加状态,
  140. //不懂的朋友们可以直接访问:http://developer.android.com/reference/java/io/File.html 
  141.                                 //来查看相关方法参数的具体涵义,吼吼 
  142.                                 fos = new FileOutputStream(new File(file.getPath()+File.separator+childName),false); 
  143.                                  
  144.                                 byte[] buff = new byte[8192]; 
  145.                                 int readIn ; 
  146.                                 //此处注意下:read方法中的参数如果不写的话,会读不到文件内容,
  147. //报异常,小马犯过的低级错误,希望你不要犯啦 
  148.                                 while((readIn = fis.read(buff,0,buff.length))!= -1){ 
  149.                                     fos.write(buff,0,readIn); 
  150.                                 } 
  151.                                 fos.flush(); 
  152.                             } catch (Exception e) { 
  153.                                 e.printStackTrace(); 
  154.                                 /*if (android.os.Environment.getExternalStorageState().equals( 
  155.                                         android.os.Environment.MEDIA_MOUNTED)) { 
  156.                                     // 如果有sdcard,磁盘空间是否满了 
  157.                                     Log.d(TAG, "DMUtils>>>sdcard is ok!"); 
  158.                                     // No space left on device 
  159.                                     if (ex.getMessage() != null 
  160.                                             && ex.getMessage().indexOf( 
  161.                                                     "No space left on device") != -1) { 
  162.                                         // 磁盘空间满 
  163.                                         throw new NoSpaceIOException(ex.getMessage()); 
  164.                                     } 
  165.                                 } else { 
  166.                                     // 文件保存失败应该检查sd卡 
  167.                                     Log.d(TAG, "DMUtils>>>sdcard is error!state: " 
  168.                                             + android.os.Environment.getExternalStorageState()); 
  169.                                 } 
  170.                                 throw new IOException(ex.getMessage() 
  171.                                         + " IOException when transferring " 
  172.                                         + oldLocation.getPath() + " to " 
  173.                                         + newLocation.getPath());*/ 
  174.                             }finally
  175.                                 //大伙应该很熟悉了吧?小马一朋友犯过的错误,未关闭流,
  176. //导致生成的文件本来是KB的却成了MB的文件,所以一定注意打开什么就关闭什么 
  177.                                 try { 
  178.                                     if(fis!=null){ 
  179.                                         fos.close(); 
  180.                                     } 
  181.                                     if(fos!=null){ 
  182.                                         fos.close(); 
  183.                                     } 
  184.                                 } catch (Exception e2) { 
  185.                                     e2.printStackTrace(); 
  186.                                 } 
  187.                             } 
  188.                         } 
  189.                         /* 
  190.                          * 因为此处小马用的是一个文件夹下的文件操作,并不包含子文件夹,
  191. * 所以:如果有朋友要用子文件夹操作的话可激活此处递归处理哦 
  192.                          */ 
  193.                         /*else if(filePath.exists() && filePath.isDirectory()){ 
  194.                             try { 
  195.                                 moveFile(filePath,new File("此处路径从全局文件中取就OK了")); 
  196.                             } catch (Exception e) { 
  197.                                 e.printStackTrace(); 
  198.                             } 
  199.                         }*/ 
  200.                     } 
  201.                 }    
  202.             } 
  203.         } 
  204.     } 
  205.      

上面代码中的方法,朋友们可以直接使用,但小马多嘴讲下:不要直接把代码COPY到你使用的工程中,因为那样本就没经过思考,以后碰到类似的问题也就不会解决了,小马很菜,这些代码如果我自己写不出来,就用个笨的方法,一边看一边想,再不行就照抄一边,眼过十遍不如手过一遍听过吧?想通了也就最好了,不会的时候再反过来看下就可以了,所以尽量不使用COPY的方式哦,吼吼。。O_O


















0 0
原创粉丝点击