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
*/
原文地址:https://www.cnblogs.com/yiqiu2324/p/3108791.html