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类而不是String
File 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.txt
System.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.txt
System.out.println(f3.getName());//a.txt 文件名
System.out.println(f4.getName());//learn 文件夹名
//length返回的是文件长度
//获取构造方法指定的文件的大小 单位为byte
//文件不存在返回0 文件夹没有大小概念 也是0
System.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 false
System.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);// false
File f2 = new File("b.txt");//不存在 创建返回true
boolean b2 = f2.createNewFile();
System.out.println(b2);// true
File 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);//true
File f2 = new File("E:\\download\\learn");//已存在文件夹
boolean mkdir2 = f2.mkdir();
System.out.println(mkdir2);//false
File 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() {
@Override
public 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")
);