1 File类的静态成员遍历
字段 | 摘要 |
---|---|
static String pathSeparator | 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 |
static char pathSeparatorChar | 与系统有关的路径分隔符。 |
static String separator | 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 |
static char separatorChar | 与系统有关的默认名称分隔符。 |
路径分割符:Windows:分号 Linux:冒号
文件名称分割符:Windows:\反斜杠 Linux:/正斜杠
注意:操作路径不能写死,应该使用File.separator来连接
2 绝对路径和相对路径
绝对路径:以盘符开始的完整路径
相对路径:相对于当前项目的根目录
C:\files\file.txt —> file.txt
路径不区分大小写
反斜杠是转义符 两个反斜杠表示一个反斜杠
3 File类的构造方法
public static void constructMethod() {File file = new File("C://test.txt");System.out.println(file);//重写了Object类的toString方法 打印文件路径 路径可以不真实存在File file2 = new File("C:","a.txt");//父子路径单独书写 变化灵活System.out.println(file2);File file3 = new File("c:\\");//第一个参数的类型是File类而不是StringFile file4 = new File(file3,"a.txt");System.out.println(file4);}
4 常用方法
获取
- getAbsolutePath
- getPath
- getName
- length:文件长度
public static void method() {File f1 = new File("a.txt");//相对路径String absolutePath = f1.getAbsolutePath();System.out.println(absolutePath);//打印绝对路径String path = f1.getPath();System.out.println(path);//打印路径参数 a.txtSystem.out.println(f1.toString());//toString源码调用的就是getPath()File f2 = new File("E:\\download\\learn\\a.txt");File f3 = new File("a.txt");File f4 = new File("E:\\download\\learn");//getName打印结尾部分 文件名/文件夹名System.out.println(f2.getName());//a.txtSystem.out.println(f3.getName());//a.txt 文件名System.out.println(f4.getName());//learn 文件夹名//length返回的是文件长度 //获取构造方法指定的文件的大小 单位为byte//文件不存在返回0 文件夹没有大小概念 也是0System.out.println(f2.length());}
判断
- exists():路径是否存在
- isDirectory():file对象是否是文件夹,路径不存在返回false
- isFile():file对象是否是文件,路径不存在返回false
public static void method() {File f1 = new File("a.txt");//相对路径System.out.println(f1.exists());File f2 = new File("E:\\download\\learn");System.out.print(f1.isFile());System.out.println(" " + f1.isDirectory());//true falseSystem.out.print(f2.isDirectory());System.out.println(" " + f2.isFile());//true false}
创建和删除
- createNewFile():当该名称的文件不存在的时候,创建一个空文件,返回true。若文件存在,不创建返回false。此方法只能创建文件,不能创建文件夹。路径必须存在,否则会抛出异常。【调用该方法会抛出IO异常 要么throws 要么try-catch】
- delete():删除file表示的文件或目录,谨慎使用,直接在硬盘删除文件/文件夹,不走回收站。注意:如果文件夹中有东西,则不会删除成功,返回false。如果路径不存在,返回false。
public static void method() throws IOException {File f1 = new File("a.txt");//相对路径 存在boolean b1 = f1.createNewFile();System.out.println(b1);// falseFile f2 = new File("b.txt");//不存在 创建返回trueboolean b2 = f2.createNewFile();System.out.println(b2);// trueFile f3 = new File("F://none");//路径不存在System.out.println(f3.createNewFile());//报错:系统找不到指定的路径}
- mkdir():创建file表示的目录
- mkdirs():创建file表示的目录 包括必须但不存在的父级目录
public static void method() throws IOException {File f1 = new File("E:\\download\\newlearn");//新文件夹boolean mkdir1 = f1.mkdir();System.out.println(mkdir1);//trueFile f2 = new File("E:\\download\\learn");//已存在文件夹boolean mkdir2 = f2.mkdir();System.out.println(mkdir2);//falseFile f3 = new File("E:\\download\\newlearn\\learn\\learn");System.out.println(f3.mkdir());// false不能创建多级目录System.out.println(f3.mkdirs());// true 可以创建多级目录File f4 = new File("F:\\download");//路径不存在System.out.println(f4.mkdir());// false}
遍历目录
- String[] list()
- File[] listFile()
注意:
如果路径不存在,会报空指针异常。
如果路径不是目录,也会报空指针异常。
可以遍历到隐藏文件夹。
public static void method() throws IOException {File f1 = new File("E:\\download\\learn\\");String[] list = f1.list();for(String i: list){//相对路径System.out.println(i);}File[] list = f1.listFiles();for(File i: list){//绝对路径System.out.println(i);}}
5 案例:递归打印多级目录
public static void main(String[] args) {File dir = new File("E:\\download\\1");getAllFiles(dir);}public static void getAllFiles(File dir){File[] files = dir.listFiles();for(File file: files){System.out.println(file);}}
打印结果:显示不全 没有子文件夹 2里面还有3和4
E:\download\1\2
E:\download\1\2.doc
E:\download\1\2.txt
解决方法:如果遇到文件夹,则递归调用getAllFiles()
public static void main(String[] args) {File dir = new File("E:\\download\\1");getAllFiles(dir);}public static void getAllFiles(File dir){File[] files = dir.listFiles();for(File file: files){if(file.isDirectory()){getAllFiles(file);}System.out.println(file);}}
E:\download\1\2\3\4.txt
E:\download\1\2\3
E:\download\1\2\3.pptx
E:\download\1\2\3.txt
E:\download\1\2
E:\download\1\2.docx
E:\download\1\2.txt
6 案例:文件搜索
只要txt文件,其他的不需要。
public class FileTest {public static void main(String[] args) {File dir = new File("E:\\download\\1");getAllFiles(dir);}public static void getAllFiles(File dir){File[] files = dir.listFiles();for(File file: files){if(file.isDirectory()){getAllFiles(file);}else {if(file.toString().endsWith(".txt")){System.out.println(file);}}}}
}
7 文件过滤器
File类中有两个listFiles的重载方法,参数类型是过滤器
java.io.fileFilter接口 用于抽象路径名的过滤器,抽象方法accept(File pathname)
java.io.fileNameFilter接口 用于过滤文件名称,抽象方法accept(File dir, String name)
文件对象用这个构造方法 —> File(dir, name)
需要自己写实现类,重写抽象方法,自定义过滤规则
listFiles对目录进行遍历,获取文件和文件夹并封装为File对象
然后调用accept方法 讲File对象传递到accept的参数
如果返回值是false就会保存到数组中
public static void getAllFiles(File dir){File[] files = dir.listFiles(new FileFilter() {@Overridepublic boolean accept(File pathname) {if (pathname.isDirectory()){return true;}return pathname.toString().endsWith("txt");}});for(File file: files){if(file.isDirectory()){getAllFiles(file);}else {System.out.println(file);}}}
输出:
E:\download\1\2\3\4.txt
E:\download\1\2\3.txt
E:\download\1\2.txt
Lambda简化
File[] files=dir.listFiles((pathname)-> pathname.isDirectory()||pathname.getName().endsWith(".txt"));