zoukankan      html  css  js  c++  java
  • day20(上)_IO流5(File方法)


    1.File类概述:

    /*
    File类概述:
      1.用来将文件或者文件夹封装成对象
      2.方便对文件与文件夹进行操作
      3.File对象可以作为参数传递给流的构造函数
    虽然流对象也能操作文件,但操作不了文件夹,也操作不了文件的属性信息(长度,修改时间..)
    
    流只能操作数据.
    */

    2.File类的构造函数:

    /*
    File构造函数:
       ①File(String pathname) 
              通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
       
       ②File(File parent, String child) 
              根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 
              如果parent为null,效果同①
       ③File(String parent, String child) 
              根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 
              如果parent为null,效果同①
        ②和③区别不大
    
    
    */
    
    
    package  filedemo;
    import java.io.File;
    class FileDemo{
      public static void sop(Object obj){
        System.out.println(obj);//封装什么,打印什么,也就是String getpath()返回值
      }
     
      public static void main(String[] args){
       
        sop(new File("a.txt")); //将a.txt封装成一个File实例,可以将已有的或未出现的文件夹封装成对象
        sop(new File(".\\a.txt"));//这里使用了相对路径
        sop(new File("d:\\","c.txt"));//将路径和文件名分别传入,这样做相对于单参传递有个优点
                                      //当文件名为变量时,可以传入变量,也就是说同一目录下不同文件
                                      
        File f1=new File("d:\\");
         sop(new File(f1,"c.txt"));
     
        sop(File.separator);//与系统有关的默认分隔符 //widows为:"\\" 
                            //"\\",把\作为普通字符处理,该字符串只有一个字符为'\'
      
        sop(new File("k:"+File.separator+"aa"+File.separator+"mm.txt"));//为了实现跨平台
         
      }                     
    
    }

    File_thumb1

    3.Flie类的常用方法示例:

    /*
     File类常见方法:
     1.创建
      public boolean createNewFile()throws IOException
            在指定路径创建文件,如果文件已经存在,则不再创建,并且反回false
            
            注意:区分操作文件的输出流对象(FileWriter/FileOutputStream)
            一建立创建文件,如果文件已存在->覆盖原文件
     File f=new File("11\\22\est.txt"); 
    sop("createF: "+f.createNewFile());//Exception in thread "main" java.io.IOException: 系统找不到指定的路径。 
    //当文件所在目录并不存在时,会发出IOExcepiton   
     
    2.删除
        public boolean delete()
            删除此抽象路径名表示的文件或目录。
            如果此路径名表示一个目录,则该目录必须为空(该目录下没有目录/文件)才能删除。
            
            如果封装的多级目录:例如11//22//33 已创建->删除33,并不是删除整个目录
            如果封装的是文件: 例如:11/abc.txt 已创建->删除abc.txt
        
        public void deleteOnExit()
            在虚拟机终止时,请求删除此抽象路径名表示的文件或目录
            根据 Java 语言规范中的定义,只有在虚拟机正常终止时,才会尝试执行删除操作。 
     3.判断
       public int compareTo(File pathname)//该类实现了Comparable接口
         按字母顺序(字典顺序)比较两个抽象路径名
       public boolean canExecute()
         测试应用程序 是否可以执行 此抽象路径名表示的文件。   
         不存在/不可执行,返回false
       
     ※public boolean exists()
        测试此抽象路径名表示的 文件或目录是否存在。 
        
        判断的是你封装的文件对象的内容是否在硬盘上存在 
     public boolean isDirectory()
          测试此抽象路径名表示的文件是否是一个目录。 
      public boolean isFile()                      
         测试此抽象路径名表示的文件是否是一个标准文件。
      //以上两个方法均判断的是被封装的对象内容,并且已在硬盘上存在,不存在,返回false
      
     
      
      public boolean isHidden()
         测试此抽象路径名指定的文件是否是一个隐藏文件。 
      public boolean isAbsolute()
        测试此抽象路径名是否为绝对路径名。
        即使该路径在硬盘上并不存在,也可以判断
    */
    package filemethod;
    import java.io.File;
    import java.io.IOException;
    class FileMethodDemo{
      public static void sop(Object obj){
      
        System.out.println(obj);
      }
      
     public static void judge_1(){
       
       sop("File2.txt是否可被应用程序执行:"+new File("File2.txt").canExecute());//该文件不存在 //false
       sop("3_FileMethodDemo.java是否可被应用程序执行:"+new File("3_FileMethodDemo.java").canExecute());//已存在,并且能被应用程序执行 //true
       sop("3_FileMethodDemo.java是否存在:"+new File("3_FileMethodDemo.java").exists()+"\n");//存在//true
    
      }
      
      
      public static void judge_2()throws IOException{
       File f=new File("abc\\1234.txt");
        f.createNewFile();
      
    //在判断文件对象是否是文件或目录时,必须要先判断该文件对象的内容是否存在
       if(f.exists()){
       sop("isDir:"+f.isDirectory());//false
       sop("isFile:"+f.isFile()+"\n");//true
       }
     }
      public static void judge_3(){
       File f=new File(".\\abc\\123.txt");
       sop(".\\abc\\123.txt:"+f.isAbsolute());//false
       f=new File("c:\\dd\\qq\\1.txt");
       sop("c:\\dd\\qq\\1.txt:"+f.isAbsolute());//true
       /*
        绝对路径:是从盘符开始的路径
        相对路径: 是从当前路径开始的路径
        
       */
      }
     
     public static void createDir(){
       File dir=new File("abc");
       sop("当前路径下创建一级目录abc:"+dir.mkdir());//创建一级目录,mkdir也是dos命令//true
       dir=new File("11\\22\\33");
       sop("当前路径下创建多级目录:"+dir.mkdirs());//创建多级目录 //true
       sop("JVM读取到的当前路径:"+System.getProperty("user.dir")+"\n");//当前路径
       /*
        JVM可以从系统属性中获取到user.dir
       */
       /*
        如果有多级目录,而调用了mkdir()->返回false,并不创建目录
       
       */
     
     }
      
    
     public static void createDel()throws IOException{
        
        File fr=new File("File1.txt");
        
        sop("当前路径下创建File1.txt文件:"+fr.createNewFile());//true
        sop("当前路径下再次创建File1.txt文件:"+fr.createNewFile());//false
        sop("删除File1.txt:"+fr.delete()+"\n");//true
        /*
         有些操作完的文件想要删除掉,
         如果在删除动作前面的代码发生异常导致删除执行不到
         这时考虑把删除放在finally中,即使这样,还有可能无法删除
         如果此时,该文件依然被流对象操作,那么无法删除(就好像,某个正在使用的文件,我们无法删除它)
         考虑使用deleteOnExit()
        */
        
         }
     
      
      public static void main(String[] args)throws IOException{
         createDel();
         judge_1();
         judge_2();
         judge_3();
         createDir();
         
      }
    }
    /*
    关于创建小结:
        创建文件时,文件所在的目录必须存在,不然发出IOException
        可以创建没有扩展名的文件,但没实际意义
        创建多级目录时,选用mkdirs()方法,如果选用mkdir,不会创建目录,并返回false
    
    */

    File1_thumb1

    /*
    获取信息:
     public String getPath()
         将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。 
        封装的什么路径,获取的就是什么路径
     public String getAbsolutePath()
         如果封装的为绝对路径,等同于getPath
         否则user.dir与封装内容拼接
     public String getParent()
         返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
       也就是最后一级的前面所有
     public String getName()
        返回的该名称 是路径名名称序列中的最后一个名称。
        如果路径名名称序列为空,则返回空字符串。 
     
     
     public long length()
     返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。 
     返回: 
     此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L。  
      
    public long lastModified()
       返回此抽象路径名表示的文件最后一次被修改的时间。 
       例如:当我操作过一次文件,把时间记录下来,别人也可能修改
            下次用时,判断最后一次被修改时间,如果是我记录时间值,
            表明在我之后没被修改,否则,被别人修改.
    
    
     public boolean renameTo(File dest)
            重新命名此抽象路径名表示的文件。如果已经存在具有目标抽象路径名的文件,
            那么该操作可能无法获得成功。 
    
    */
    package filedemo;
    import java.io.File;
    import java.io.IOException;
    class FileMethodDemo2{
        public static void sop(Object obj){
        
          System.out.println(obj);
        }
        
        public static void reName()throws IOException{
         File f1=new File("d:\\abc.txt");
         f1.createNewFile();
         File f2=new File("f:\\mm.java");
         sop("rename: "+f1.renameTo(f2));//会将d盘下创建的abc.txt->移动到f盘下
                                         //并且重命名为mm.java
                                         //相当于windows的剪切+粘贴+重命名
            /*
             当abc.txt不存在或mm.java已存在
             返回false
            */
        }
        
        public static void getFileInfo(){
          File f=new File("g:\\abcd\\efg\\a.txt");
          sop("getPath(): "+f.getPath());
          sop("getAbsPath(): "+f.getAbsolutePath());//相当于getPath()
          sop("getPar(): "+f.getParent());
          sop("getName: "+f.getName());
          sop("\n");
          
          f=new File(".\\abc\\efg");
          sop("getPath(): "+f.getPath());
          sop("getAbsPath(): "+f.getAbsolutePath());//user.dir与封装的内容拼接
          sop("getPar(): "+f.getParent());//返回的是最后一级目录的 前面的路径
          sop("getName: "+f.getName()+"\n");
          
          f=new File("1.txt");//该文件在硬盘上存在 //内容abc
          sop("getAbsolute: "+f.getAbsolutePath());
          sop("lastM: "+f.lastModified());//最后一次修改时间与1970 年 1 月 1 日,00:00:00 GMT 毫秒时间差
          sop("length(): "+f.length());//返回是文件内容在硬盘上所占的字节数
        }
        public static void main(String[] args)throws IOException{ 
          getFileInfo();
          reName();
        }
    }

    File_thumb4

    4.File类的list的方法:

    /*
      static File[] listRoots() 
              列出可用的文件系统根.
              表示可用文件系统根的 File 对象数组,如果无法确定根集,
              则返回 null。如果没有文件系统,那么该数组将为空。
              也就是列出了计算机中所有盘符
      
      public String[] list()
       返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 
     
       每个字符串是一个文件名/目录名而不是一条完整路径,注意区别listFiles方法 
      
       表示目录本身及其父目录的名称不包括在结果中。
       
       如果目录为空,那么数组也将为空(length=0)。
       
       如果此抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。 
      
    public File[] listFiles()
      得到的每个抽象路径名都是根据此抽象路径名,
      使用 File(File, String) 构造方法构造*/
    package filedemo;
    import java.io.File;
    import java.util.Arrays;
    import java.io.FileFilter;
    import java.io.FilenameFilter;
    class FileMethodDemo3{
     static int[] arr={1,2,3};
     public static void listRootsDemo(){
      for(File file :File.listRoots())
        System.out.println(file);//当需要确定写入的目的地时,需要获取盘符
     
    }
    
     public static void listDemo(){
        File f=new File("f:\\");
        for(String str : f.list())
          System.out.println(str);//列出所有文件/目录,包括隐藏的
         
         
        f=new File("f:\\abc.txt");
         for(String str : f.list())
             System.out.println(str);//
    NullPointerException,f.list()返回null //
    这是因为在遍历过程中会使用到f.list().length
                                     //例如:int[] arr=null;arr.length;//将null作为一个数组,获得其长度,发出NullPointerException 
                                     //如果该目录存在并且其下没有内容,返回一个length=0的String数组
     }                               
     public static void main(String[] args){
     
       listRootsDemo();
       listDemo();
     }
    
    }
    
    listDemo_thumb2

    5.过滤出指定的文件:

    class FileFilterImp implements FileFilter{
        
      //过滤出后缀名为java的文件
    public boolean accept(File pathname){
             //pathname为f中的封装路径+该路径下的文件名 
         String fileName=pathname.getName();
            String[] fileSuff=fileName.split("\\.");
            return fileSuff[fileSuff.length-1].equals("java"));
          }
        
    }
    class FileFilterDemo{
        public static void main(String[] args){
           File f=new File("../");//当前目录的上一级目录
           /*
           
            File[] listFiles(FileFilter filter) 
              返回抽象路径名数组,
              这些路径名表示此
              抽象路径名表示的目录中满足指定过滤器的文件和目录。 
              
           */
           File[] path=f.listFiles(new FileFilterImp());
           for(File file : path)
             System.out.println(file.getName()+" "+file.length()+"B");
    
           /*
           public String[] list(FilenameFilter filter)
           返回一个字符串数组,
           这些字符串指定此抽象路径名(调用list的File对象中封装的内容)表示的目录中满足指定过滤器的文件和目录。
           如果给定 filter 为 null,则接受所有名称。
           */
          
          String[] files=f.list(new FilenameFilter(){ //匿名内部类
           
            public boolean accept(File dir,String name){
             //dir:f中封装路径 ,name:f.list()中的文件 
         return name.endsWith(".java");//用endWith方法
            }
           });
           for(String fileName : files)
               System.out.println(fileName);
        }
    }

    _thumb1

    listFiles(FileFilter)与list(FilenameFilter)底层:

    /*
    //list源码:
      public String[] list(FilenameFilter filter) {
            String names[] = list();
            if ((names == null) || (filter == null)) {
                return names;
            }
            List<String> v = new ArrayList<>();
            for (int i = 0 ; i < names.length ; i++) {
                if (filter.accept(this, names[i])) {//由此可见this代表创建的File对象
                    v.add(names[i]);                //dir指向了该File对象
                }
            }
            return v.toArray(new String[v.size()]);//集合转换成String数组
        }
    //listFiles源码   
    public File[] listFiles(FilenameFilter filter) {
            String ss[] = list();
            if (ss == null) return null;
            ArrayList<File> files = new ArrayList<>();
            for (String s : ss)
                if ((filter == null) || filter.accept(this, s))
                    files.add(new File(s, this));//File对象中封装了目录+文件
            return files.toArray(new File[files.size()]);
        }
    
    

     public File[] listFiles(FileFilter filter) {
            String ss[] = list();
            if (ss == null)
                return null;
            ArrayList<File> files = new ArrayList<>();
            for (String s : ss) {
                File f = new File(s, this);
                if ((filter == null) || filter.accept(f))
                    files.add(f);
            }
            return files.toArray(new File[files.size()]);
        }

    
    
    */
    /*
     实际开发用listFiles而不是list因为listFiles返回File[],那么每个文件对象
     可使用File中方法,例如getName,length
    */
  • 相关阅读:
    平安夜前夜,我在上海沐恩堂度过
    吃匹萨的数学
    2004语录
    爱的罗曼斯
    转发: 上季度全球最佳短篇小说《最后一趟生意》
    一个人的元宵节
    超越纪念我的blog排名上升到第六位
    读《仆人》
    我的龟宝宝病了:( 谁来救救她?
    春晚
  • 原文地址:https://www.cnblogs.com/yiqiu2324/p/3108791.html
Copyright © 2011-2022 走看看