File类
介绍
java.io.File类
- 文件和目录路径名(文件夹)的抽象表示形式。
- 我们可以使用File类对文件和文件夹进行操作
静态成员变量
名称 | 解释 |
---|---|
static String pathSeparator | 与系统有关的路径分隔符,为了方便,它被表示为一个字符串 |
static char pathSeparatorChar | 与系统有关的路径分隔符 |
static String separator | 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串 |
static char separatorChar | 与系统有关的默认名称分隔符 |
注意:
- 路径分隔符 windows:分号; linux:冒号:
- 文件名称分隔符 windows:反斜杠\ linux:正斜杠/
import java.io.File;
public class Demo01File {
public static void main(String[] args) {
// pathSeparatorChar和pathSeparator其实一样,就是一个是字符,一个是字符串
System.out.println(File.pathSeparator); // 路径分隔符 windows:分号; linux:冒号:
// separatorChar和separator其实一样,就是一个是字符,一个是字符串
System.out.println(File.separator); // 文件名称分隔符 windows:反斜杠\ linux:正斜杠/
}
}
输出结果:
;
\
构造方法
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
相关知识补充:
路径
分2种,绝对路径
和相对路径
。
绝对路径:
一个完整的路径,从盘符(C:,D:)开始
举例:
C:\a.txt
E:\Coding\Java\java-study2\a.txt
相对路径:
相对于当前项目的根目录(E:\Coding\Java\java-study2)
举例:
E:\Coding\Java\java-study2\a.txt,用相对路径可以简化成 a.txt(省略项目的根目录)
注意:
- 路径不区分大小写
- 路径中的文件名称分隔符在windows中用反斜杠,反斜杠是转义字符,两个反斜杠代表一个反斜杠
import java.io.File;
public class Demo02File {
public static void main(String[] args) {
show1();
show2();
show3();
}
/**
* File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
* String pathname:路径名称
*
* 路径可以是文件或者文件夹
* 路径可以是绝对路径或者相对路径
* 路径可以是真实存在或者不存在
*/
private static void show1() {
// 绝对路径和文件
File file1 = new File("C:\\a.txt");
System.out.println(file1); // C:\a.txt
// 绝对路径和文件夹
File file2 = new File("C:\\java\\a");
System.out.println(file2); // C:\java\a
// 相对路径文件
File file3 = new File("a.txt");
System.out.println(file3); // a.txt
}
/**
* File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
* String parent:父路径名称
* String child:子路径名称
* 优点:
* 父子路径都可以更改,使用更灵活
*/
private static void show2() {
File file = new File("C:\\","a.txt");
System.out.println(file); // C:\a.txt
}
/**
* File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
* File parent:File类对象的父路径
* String child:字符串子路径
* 优点:
* 子路径都可以更改,使用更灵活
*/
private static void show3() {
File parent = new File("C:\\");
File file = new File(parent,"a.txt");
System.out.println(file); // C:\a.txt
}
}
获取功能的方法
Public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
Public String getPath() 将此抽象路径名转换为一个路径名字符串。
Public String getName() 返回由此抽象路径名表示的文件或目录的名称。
public long length()返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。
import java.io.File;
public class Demo03File {
public static void main(String[] args) {
show1();
show2();
show3();
show4();
}
/**
* Public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
* 无论构造方法传入的是绝对路径还是相对路径,该方法返回的都是绝对路径
*/
private static void show1() {
File file1 = new File("E:\\Coding\\Java\\java-study2\\a.txt");
System.out.println(file1.getAbsolutePath()); // E:\Coding\Java\java-study2\a.txt
File file2 = new File("a.txt");
System.out.println(file2.getAbsolutePath()); // E:\Coding\Java\java-study2\a.txt
}
/**
* Public String getPath() 将此抽象路径名转换为一个路径名字符串。
* 构造方法传入相对路径则返回相对路径,反之则绝对路径
*
* toString()实际上调用的是getPath()方法
* 源码:
* public String toString() {
* return getPath();
* }
*/
private static void show2() {
File file1 = new File("E:\\Coding\\Java\\java-study2\\a.txt");
System.out.println(file1.getPath()); // E:\Coding\Java\java-study2\a.txt
File file2 = new File("a.txt");
System.out.println(file2.getPath()); // a.txt
System.out.println(file1); // E:\Coding\Java\java-study2\a.txt
System.out.println(file1.toString()); // E:\Coding\Java\java-study2\a.txt
}
/**
* Public String getName() 返回由此抽象路径名表示的文件或目录的名称,即获取结尾部分(文件或文件夹)
*
*/
private static void show3() {
File file1 = new File("E:\\Coding\\Java\\java-study2\\a.txt");
System.out.println(file1.getName()); // a.txt
File file2 = new File("E:\\Coding\\Java\\java-study2");
System.out.println(file2.getName()); // java-study2
}
/**
* public long length()返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。
* 获取指定的文件大小,单位是字节
* 注意:
* 文件夹是没有大小概念的
* 给定路径不存在,会返回0
*/
private static void show4() {
// 文件夹
File file1 = new File("E:\\Coding\\Java\\java-study2");
System.out.println(file1.length()); // 4096 windows系统中文件夹默认4096字节,该大小可以自定义,不同操作系统默认大小可能不同。
// 真实存在的文件
File file2 = new File("E:\\Coding\\Java\\java-study2\\a.txt");
System.out.println(file2.length()); // 14
// 不存在的文件
File file3 = new File("E:\\Coding\\Java\\java-study2\\b.txt");
System.out.println(file3.length()); // 0
}
}
判断功能的方法
boolean exists() 判断此抽象路径名表示的文件或目录是否存在。
boolean isFile() 判断此抽象路径名表示的文件是否是一个标准文件。不存在的路径则返回false。
boolean isDirectory() 判断此抽象路径名表示的文件是否是一个目录。不存在的路径则返回false。
import java.io.File;
public class Demo04File {
public static void main(String[] args) {
/**
* boolean exists() 判断此抽象路径名表示的文件或目录是否存在。
*
* boolean isDirectory() 判断此抽象路径名表示的文件是否是一个目录。
* 不存在的路径则返回false
*
* boolean isFile() 判断此抽象路径名表示的文件是否是一个标准文件。
* 不存在的路径则返回false
*/
// 真实存在的文件
File file1 = new File("E:\\Coding\\Java\\java-study2\\a.txt");
// 真实存在的文件夹
File file2 = new File("E:\\Coding\\Java\\java-study2");
// 不存在的文件
File file3 = new File("E:\\Coding\\Java\\java-study2\\b.txt");
// 不存在的文件夹
File file4 = new File("E:\\Coding\\Java\\java-study3");
// 判断是否存在
System.out.println("E:\\Coding\\Java\\java-study2\\a.txt 是否存在:" + file1.exists());
System.out.println("E:\\Coding\\Java\\java-study2 是否存在:" + file2.exists());
System.out.println("E:\\Coding\\Java\\java-study2\\b.txt 是否存在:" + file3.exists());
System.out.println("E:\\Coding\\Java\\java-study3 是否存在:" + file4.exists());
// 判断是不是文件
System.out.println("E:\\Coding\\Java\\java-study2\\a.txt 是文件吗?:" + file1.isFile());
System.out.println("E:\\Coding\\Java\\java-study2 是文件吗?:" + file2.isFile());
System.out.println("E:\\Coding\\Java\\java-study2\\b.txt 是文件吗?:" + file3.isFile());
System.out.println("E:\\Coding\\Java\\java-study3 是文件吗?:" + file4.isFile());
// 判断是不是文件夹
System.out.println("E:\\Coding\\Java\\java-study2\\a.txt 是文件夹吗?:" + file1.isDirectory());
System.out.println("E:\\Coding\\Java\\java-study2 是文件夹吗?:" + file2.isDirectory());
System.out.println("E:\\Coding\\Java\\java-study2\\b.txt 是文件夹吗?:" + file3.isDirectory());
System.out.println("E:\\Coding\\Java\\java-study3 是文件夹吗?:" + file4.isDirectory());
}
}
输出结果:
E:\Coding\Java\java-study2\a.txt 是否存在:true
E:\Coding\Java\java-study2 是否存在:true
E:\Coding\Java\java-study2\b.txt 是否存在:false
E:\Coding\Java\java-study3 是否存在:false
E:\Coding\Java\java-study2\a.txt 是文件吗?:true
E:\Coding\Java\java-study2 是文件吗?:false
E:\Coding\Java\java-study2\b.txt 是文件吗?:false
E:\Coding\Java\java-study3 是文件吗?:false
E:\Coding\Java\java-study2\a.txt 是文件夹吗?:false
E:\Coding\Java\java-study2 是文件夹吗?:true
E:\Coding\Java\java-study2\b.txt 是文件夹吗?:false
E:\Coding\Java\java-study3 是文件夹吗?:false
创建、删除文件和文件夹功能的方法
public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定名称的文件时,创建一个新的空文件。
boolean mkdir() 创建单级文件夹。
boolean mkdirs() 既可创建单级文件夹,也可以创建多级文件夹。
public boolean delete() 删除指定路径名表示的文件或目录
import java.io.File;
public class Demo05File {
public static void main(String[] args) throws IOException {
show1();
show2();
show3();
}
/**
* public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定名称的文件时,创建一个新的空文件。
* 创建的文件的路径和文件名有构造方法传入
* true:文件不存在,创建文件,返回true
* flase:文件存在,不会创建,返回false
*/
private static void show1() throws IOException {
File file1 = new File("E:\\Coding\\Java\\java-study2\\src\\com\\zsd\\stage1_3_6\\demo1\\a.txt");
boolean b = file1.createNewFile();
System.out.println("是否成功创建新文件?:" + b); // 是否成功创建新文件?:true
b = file1.createNewFile();
System.out.println("是否成功创建新文件?:" + b); // 是否成功创建新文件?:false
}
/**
* boolean mkdir() 创建单级文件夹。
* boolean mkdirs() 既可创建单级文件夹,也可以创建多级文件夹。
* true:文件夹不存在,创建文件夹,返回true
* false:文件夹存在,不会创建文件夹,返回false。构造方法给出路径不存在,返回false。
*/
private static void show2() {
// 创建单级文件夹
File file1 = new File("111");
boolean b1 = file1.mkdir();
System.out.println(b1); // true
// 创建多级文件夹
File file2 = new File("222\\333\\444\\555");
boolean b2 = file2.mkdirs();
System.out.println(b2); // true
// 在前面创建了一部分文件夹的基础上,继续创建文件夹
File file3 = new File("222\\333\\444\\555\\666");
boolean b3 = file3.mkdirs();
System.out.println(b3); // true
}
/**
* public boolean delete() 删除指定路径名表示的文件或目录
* true:删除文件或文件夹成功,返回true
* false:文件夹中有内容,不会删除,返回false。构造方法的路径不存在,返回false。
* 注意:
* 被删除的文件或文件夹直接从硬盘消失,不会出现在回收站!!!
*/
private static void show3() {
File file1 = new File("E:\\Coding\\Java\\java-study2\\src\\com\\zsd\\stage1_3_6\\demo1\\a.txt");
boolean b1 = file1.delete();
System.out.println("第1次删除a.txt:"+b1); // 第1次删除a.txt:true
boolean b2 = file1.delete();
System.out.println("第2次删除a.txt:"+b2); // 第2次删除a.txt:false
File file2 = new File("111");
boolean b3 = file2.delete();
System.out.println("删除空文件夹111:"+b3); // 删除空文件夹111:true
File file3 = new File("222");
boolean b4 = file3.delete();
System.out.println("删除内部还有多级文件夹的222:"+b4); // 删除内部还有多级文件夹的222:false
// 不存在的文件夹
File file4 = new File("777");
boolean b5 = file4.delete();
System.out.println("删除不存在的文件夹777:"+b5); // 删除不存在的文件夹777:false
}
}
目录遍历功能的方法
public String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
public File[] listFiles()返回一个File数组,这些路径名表示此抽象路径名表示的目录中的文件。
import java.io.File;
// 目录遍历
public class Demo06File {
public static void main(String[] args) {
show1();
show2();
}
/**
* public String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
*
* 遍历构造方法传入的目录,把目录下的文件和文件夹名称全部存到String数组中(可以遍历到隐藏的文件和文件夹)
* 点击文件或者文件夹右键选择属性,隐藏选项打钩,应用确定,文件或者文件夹就隐藏了。
*
* 构造方法的目录不存在,抛空指针异常
* 构造方法传入的不是一个目录,抛空指针异常
*/
private static void show1() {
// 真实存在的文件夹目录
File file1 = new File("E:\\Coding\\Java\\java-study2\\src\\com\\zsd\\stage1_3_6\\demo1");
// 构造方法的目录不存在,抛空指针异常
//File file1 = new File("E:\\Coding\\Java\\java-study2\\src\\com\\zsd\\stage1_3_6\\demo100");
// 构造方法传入的不是一个目录,抛空指针异常
// 即使传入真实存在的文件路径,也抛出空指针异常
//File file1 = new File("E:\\Coding\\Java\\java-study2\\src\\com\\zsd\\stage1_3_6\\aa.txt");
String[] list = file1.list();
for (String s : list) {
System.out.println(s);
}
// 输出结果
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\aa.txt
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\Demo01File.java
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\Demo02File.java
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\Demo03File.java
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\Demo04File.java
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\Demo05File.java
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\Demo06File.java
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\我是一个隐藏文件.txt
// E:\Coding\Java\java-study2\src\com\zsd\stage1_3_6\demo1\我是一个隐藏文件夹
}
/**
* public File[] listFiles()返回一个File数组,这些路径名表示此抽象路径名表示的目录中的文件。
*
* 遍历构造方法传入的目录,把目录下的文件和文件夹名称封装成File对象,并存到File数组中(可以遍历到隐藏的文件和文件夹)
*/
private static void show2() {
// 真实存在的文件夹目录
File file1 = new File("E:\\Coding\\Java\\java-study2\\src\\com\\zsd\\stage1_3_6\\demo1");
File[] list = file1.listFiles();
for (File file : list) {
System.out.println(file);
}
// 输出结果
// aa.txt
// Demo01File.java
// Demo02File.java
// Demo03File.java
// Demo04File.java
// Demo05File.java
// Demo06File.java
// 我是一个隐藏文件.txt
// 我是一个隐藏文件夹
}
}
递归遍历目录
/**
* 递归遍历得到文件夹下所有的文件夹和文件
* 使用listFiles()只能得到下一级的文件和文件夹
* 例如:
* a\b\c.txt 使用listFiles()方法遍历a文件夹,只能遍历到c文件夹,遍历不到c文件夹下的test.txt
*
* 测试的文件目录结构如下:
* D:\a
* D:\a\b
* D:\a\b\c
* D:\a\b\c.txt
* D:\a\b.txt
*
*/
import java.io.File;
public class Demo07File {
public static void main(String[] args) {
File file = new File("D:\\a");
// 1.只使用使用listFiles()方法遍历
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
System.out.println("=============分割线==============");
// 2.递归遍历
getFiled(file);
}
private static void getFiled(File dir) {
// 打印要遍历的目录
System.out.println(dir.getAbsolutePath());
// 遍历当前目录
File[] files = dir.listFiles();
for (File file : files) {
if(file.isDirectory()){
// 还是目录就递归调用自己
getFiled(file);
}else{
// 文件
System.out.println(file.getAbsolutePath());
}
}
}
}
输出结果:
D:\a\b
D:\a\b.txt
=============分割线==============
D:\a
D:\a\b
D:\a\b\c
D:\a\b\c.txt
D:\a\b.txt