IO(1)----File类

版权声明:未经同意,严禁转载 https://blog.csdn.net/pengchengliu/article/details/82778433

一、File类概述                                                                                                                                            点击此处返回总目录

二、File类的静态成员变量

三、File类的构造方法

四、File类的常用方法

五、案例:深度优先遍历目录

一、File类概述

File类用来操作文件和目录。Java将操作系统中的文件、目录、路径封装成了File类。这样就可以通过File类提供的方法,来操作文件和目录了。

File类具有平台无关性。平台指操作系统。File类既适合Linux系统,又适合Windows系统,屏蔽掉了系统的不同。

二、File类的静态成员变量

1. public static final String pathSeparator      //与系统有关的路径分隔符。什么是路径分隔符?配置环境变量的时候,用的是分号将两                                                                          个路径分开的,这个分号就是路径分隔符。路径分隔符就是目录的分割,表示这个目录已                                                                        经结束了。在windows下面目录分隔符是分号,而在Linux下面是冒号。不同的操作系统                                                                          中,这个静态成员的值是不一样的。虽然是final的,但是不同的操作系统不一样。

2. public static final String separator             //与系统有关的默认名称分隔符。什么是名称分隔符?windows下面路径为"F:\Java\a.txt",

                                                                      这个右斜线就是名称分隔符。在windows下面名称分隔符是"\",而在Linux下面是"/"。

要想写一个程序,具有跨平台性的话,做目录绝对不能把符号写死了。写死了,就难以跨平台了。以后的课程讲解,遇不到Linux系统,所以可以直接写,如果以后要做与系统无关的,就必须要用变量来做了。

例:

package cn.itcast.demo01;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        String s1 = File.pathSeparator;
        System.out.println(s1);            //结果为";",
        
        String s2 = File.separator;
        System.out.println(s2);            //结果为"\"
        
    }
}

三、File类的构造方法

File类的构造方法一定要记住,一共有三种重载形式,必须要熟练。

1. public File(String pathname)              //将路径封装成一个File类的对象。pathname可以是一个目录,也可以是一个文件。【例1】

注意:

a. windows下面文件夹名和文件名不区分大小写。目录AAA与AaA重名,文件BB.txt与Bb.txt重名。Linux下面区分大小写。

b. 这个构造器的功能很单一,只是把路径变成了一个File类的对象,通过对象可以调用里面的方法。但是这个路径有没有,是真路径还是假路径,构造方法可不管。可以通过exists()方法来判断路径名表示的文件或目录是否存在。

例1:

package cn.itcast.demo02;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File f = new File("d:\\aaa\\bbb");
        System.out.println(f);                                   //d:\aaa\bbb
    }
}

2. public File(String parent,String child)      //参数为两个字符串,分别是父路径和子路径。这个构造器把父路径和子路径分开。【例2】

注:

这个构造器和上一个构造器的效果是一样的。那有什么不同呢?分的越开,灵活性越高。一个参数的构造方法写死了,而两个参数的要灵活,既可以单独地处理父路径,又可以单独地处理子路径。比如可以把子路径当参数来传入。【例3】

例2:

package cn.itcast.demo02;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File f = new File("d:","aaa\\bbb");
        System.out.println(f);                            //d:\aaa\bbb。运行结果是一个完整路径。
    }
}

例3:两个参数,可以灵活处理。

package cn.itcast.demo02;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File f = new File("d:",args[0]);
        System.out.println(f);
    }
}

3. public File(File parent,String child)            //也是子父,但是父路径不再是String类型,而是File类型。【例4】

注:

    2与3这两个构造函数,都是传入两个路径,是不是有点重复?3的好处是:父路径是File类型,可以直接调用File类的方法。

例4:

package cn.itcast.demo02;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File parent = new File("c:");
        File f = new File(parent,"aaa\\bbb");
        System.out.println(f);                                     //c:\aaa\bbb
    }
}

四、File类的常用方法

1. public boolean createNewFile() throws IOException    //创建文件。成功返回true,如果文件已经存在,则返回false。【例1】

                                                                                        这个方法只能创建文件,不能创建目录。系统不以有没有后缀区分文件和目录

                                                                                        创建的路径和文件名是在File类的构造方法中给出的。

2. public boolean mkdir() throws IOException                  //创建目录。成功返回true,如果目录已经存在,则返回false。【例2】

                                                                                        这个方法只能创建一级的目录,不能创建多级目录。

3. public boolean mkdirs() throws IOException                //这个方法可以创建多级文件夹。【例3】

                                                                                        使用的时候,推荐使用throws,既可以创建一层文件夹,又可以多层。

4. public boolean delete()                                                //既可以删除文件,又可以删除文件夹。如果此路径名表示一个目录,则该目                                                                                            录必须为空才能删除。删除成功返回true。失败返回false。删除方法不走回                                                                                            收站,直接从硬盘中干掉了。删除有风险,运行需谨慎。【例4】

5. public String getName()                                               //获取路径中表示的文件名或目录名。比如"c:\\aaa\\abc.txt",返回"abc.txt" ;                                                                                           "c:\\aaa\bbb",则返回"bbb"。实际上是字符串截取,得到字符串最后一                                                                                                  个"\\"后面的内容,也不检查到底这个文件或目录存不存在。【例5】

6. public long length()                                                    //获取文件的大小。以字节为单位。这个方法不能获取文件夹的大小。【例6】

7. public String getAbsolutePath()                                 //获取绝对路径。【例7】

8. public File getAbsoluteFile()                                      //获取绝对路径。跟上一个一样,推荐使用该方法。返回的类型不同。【例7】

9. public String getParent()                                           //获取父路径。实际上是字符串截取,与getName()相反,得到的是"\\"前面的内                                                                                         容。比如,输入"aaa\\ccc",返回的是“aaa”;输入"tt",返回null。并不检查目录                                                                                         是否真的存在,也不管相对路径绝对路径,仅仅是字符串处理。【例8】。

10. public File getParentFile()                                       //获取父路径。跟上一个一样,推荐使用该方法。返回的类型不同。【例8】

11. public boolean exists()                                             //判断File类的构造方法中封装的路径(文件或目录)是否存在。【例9】

12. public boolean isDirectory()                                    //判断File类的构造方法中封装的路径是不是目录。如果不存在,返回false;如                                                                                         果存在但是不是目录,也返回false。【例10】

13. public boolean isFile()                                             //判断File类的构造方法中封装的路径是不是文件。如果不存在,返回false;如                                                                                         果存在但是不是文件,也返回false。

14. public String[] list()                                                  //遍历File类构造方法中的路径。得到一个String数组。如果没有该目录或者不                                                                                           是目录,则报空指针异常。返回的只有名字。【例11】

15. public File[] listFiles()                                              //遍历File类构造方法中的路径。与上一个函数一样,推荐使用该方法。返回类                                                                                           型不同。返回的是全路径。【例12】

例1:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\aaa.txt");
        boolean b = f.createNewFile();
        System.out.println(b);
    }
}

例2:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\abc");
        boolean b = f.mkdir();
        System.out.println(b);
    }
}

例3:创建多级文件夹。

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\bbb\\ccc\\ddd");
        boolean b = f.mkdirs();
        System.out.println(b);
    }
}

例4:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\aaa");
        boolean b = f.delete();
        System.out.println(b);
    }
}

例5:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\aaa");
        String s = f.getName();
        System.out.println(s);                              //aaa
    }
}

例6:获取文件的大小。

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\bbb\\test.pptx");
        long length = f.length();
        System.out.println(length);                        
    }
}

例7:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("aaa");
        
        String s = f.getAbsolutePath();
        System.out.println(s);             //D:\workspace\day22\aaa
        
        File file = f.getAbsoluteFile();
        System.out.println(file);          //D:\workspace\day22\aaa
    }
}

例8:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("c:\\aaa\\bbb.txt");
        
        String s = f.getParent();
        System.out.println(s);             //c:\aaa
        
        File file = f.getParentFile();
        System.out.println(file);          //c:\aaa
        
    }
}

例9:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\bbb\\test.pptx");
        boolean b = f.exists();
        System.out.println(b);
    }
}

例10:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\bbb\\ccc");
        boolean b = f.isDirectory();
        System.out.println(b);
        
    }
}

例11:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\bbb");
        String[] files = f.list();
        for(String s:files){
            System.out.println(s);
        }
        
    }
}

运行结果:

ccc
test.pptx

例12:

package cn.itcast.demo03;

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        File f = new File("e:\\bbb");
        File[] files = f.listFiles(); 
        for(File f1:files){
            System.out.println(f1);
        }
        
    }
}

运行结果:

e:\bbb\ccc
e:\bbb\test.pptx

16. public File[] listFiles(FileFilter filter)                        //列出File类构造方法表示的目录中,满足指定过滤器的文件和目录。

【需求】

比如,下列目录结构:

e:\\bbb\\liupc.java                    //文件

e:\\bbb\\lijing.java                    //文件

e:\\bbb\\liubo.txt                      //文件

e:\\bbb\\guoshaoying.java       //目录

希望只得到java文件,而过滤掉其他文件。

【分析】

希望仅得到满足要求的文件,这时候需要用到listFiles的一个重载的方法。方法的参数是一个FileFilter的对象。我们先看一下FileFilter的实现:

public interface FileFilter {
    boolean accept(File pathname);

}

可以看到,FileFilter是一个接口,里面只有一个函数需要实现,即accept();

而pathname就是文件名,我们需要自定义FileFilter的实现类,重写accept()抽象方法,完成过滤文件的逻辑。然后把实现类对象传给

listFiles()方法作为参数。

【代码】

//FF.java

package cn.itcast.demo04;

import java.io.File;

import java.io.FileFilter;

public class FF implements FileFilter{
    public boolean accept(File pathname){
        if(pathname.isDirectory()){
            return false;
        }
        String filename = pathname.getName();
        if(filename.endsWith(".java")){
            return true;
        }else{
            return false;
        }
    }
}

//Test.java

package cn.itcast.demo04;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File file = new File("e:\\bbb");
        File[] files = file.listFiles(new FF());                 //传递的是FileFilter接口的实现类的对象。
        for(File f:files){
            System.out.println(f);
        }
    }
}

运行结果:

e:\bbb\lijing.java
e:\bbb\liupc.java

【文件过滤器的原理分析】

accept()方法是listFiles()调用的。执行步骤:

步骤1:首先listFile()方法遍历e:\\bbb,获得文件和目录名"e:\\bbb\\liupc.java"

步骤2:listFile()方法调用过滤器的accept()方法,并把"e:\\bbb\\liupc.java"传递给其参数pathname

步骤3:accept()方法接收到参数,进行判断,是java文件,返回true

步骤4:listFiles()方法,看到accept()返回true,则将"e:\\bbb\\liupc.java"装进File[]数组

依次判断其他文件,将accept()返回为true的放入数组,返回false的不放入数组。

最终数组中就只有满足条件的结果了。

五、案例:深度优先遍历目录

比如有下列目录结构:

AAA:

      liupc.mov

      BBB目录:

             liupc.txt

             CCC目录:

                  lijing.txt

      CCC目录:

           liubo.pdf

           guoshaoying.pdf

代码:

package cn.itcast.demo05;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        String path = "e:\\aaa";
        File file = new File(path);
        String absolutePath = file.getAbsolutePath();
        Traversal(absolutePath);
    }
    
    public static void Traversal(String path){
        File file = new File(path);
        String[] files = file.list();
        for(String s:files){
            String newpath = path + "\\" + s;
            System.out.println(newpath);
            File newfile = new File(newpath);
            if(newfile.isDirectory()){
                Traversal(newpath);
            }
        }
        
    }
}

运行结果:

e:\aaa\BBB
e:\aaa\BBB\CCC
e:\aaa\BBB\CCC\lijing.txt
e:\aaa\BBB\liupc.txt
e:\aaa\CCC
e:\aaa\CCC\guoshaoying.pdf
e:\aaa\CCC\liubo.pdf
e:\aaa\liupc.mov

 

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/82778433