一、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() //创建目录。成功返回true,如果目录已经存在,则返回false。【例2】 这个方法只能创建一级的目录,不能创建多级目录。 3. public boolean mkdirs() //这个方法可以创建多级文件夹。【例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) { 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) { 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 |