目录
一、概述
- File对象就表示一个路径,可以使文件的路径,也可以是文件夹的路径。
- 这个路径可以是存在的,也可以是不存在的。
扩展知识: 路径:
- 绝对路径:带盘符的。
- 相对路径:不带盘符的,默认到当前项目下去找。
二、File 构造方法
方法名称 | 说明 |
public File ( String pathname ) | 根据文件路径创建文件对象 |
public File ( String parent,String child ) | 根据父路径名字符串和子路径名字符串创建文件对象 |
public File ( File parent,String child ) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
public class FileDemo01 {
public static void main(String[] args) {
// 1.根据字符串表示的路径
// 变成File对象
String str = "C:\\Users\\alienware\\Desktop\\a.txt";
File f1 = new File(str);
System.out.println(f1); // C:\Users\alienware\Desktop\a.txt
// 将字符串变成File对象 就可以使用File对象方法
// 2.根据父路径和子路径名称创建文件对象
// 父路径:C:\Users\alienware\Desktop
// 子路径:a.txt
String parent = "C:\\Users\\alienware\\Desktop";
String child = "a.txt";
File f2 = new File(parent, child);
System.out.println(f2); // C:\Users\alienware\Desktop\a.txt
// \:转义字符
File f3 = new File(parent + "\\" + child);
// 3.把一个File表示的路径和String表示路径进行拼接
File parent2 = new File("C:\\Users\\alienware\\Desktop");
String child2 = "a.txt";
File f4 = new File(parent2, child2);
System.out.println(f4);
}
}
三、File 常见成员方法
1. 判断与获取
方法名称 | 说明 |
public boolean isDirectory ( ) | 判断此路径名表示的File是否为文件夹 |
public boolean isFile ( ) | 判断此路径名表示的File是否为文件 |
public boolean exists ( ) | 判断此路径名表示的File是否存在 |
public long length ( ) | 返回文件的大小(字节数量) |
public string getAbsolutePath ( ) | 返回文件的绝对路径 |
public string getPath ( ) | 返回定义文件时使用的路径 |
public string getName ( ) | 返回文件的名称,带后缀 |
public long lastModified ( ) | 返回文件的最后修改时间(时间毫秒值) |
判断:
public class FileDemo02 {
public static void main(String[] args) {
//1.对文件的路径进行判断
File f1 = new File("D:\\aaa\\a.txt");
System.out.println(f1.isDirectory()); //false
System.out.println(f1.isFile()); //true
System.out.println(f1.exists()); //true
//2.对文件夹的路径进行判断
File f2 = new File("D:\\aaa\\bbb");
System.out.println(f1.isDirectory()); //true
System.out.println(f1.isFile()); //false
System.out.println(f1.exists()); //true
//3.对不存在的路径进行判断
File f3 = new File("D:\\aaa\\c.txt");
System.out.println(f1.isDirectory()); //false
System.out.println(f1.isFile()); //false
System.out.println(f1.exists()); //false
}
}
获取:
public class FileDemo03 {
public static void main(String[] args) {
// 1.length 返回文件大小
// 细节: 方法只能返回文件大小,单位是字节
// 方法无法获取文件夹大小
// 如果想要获取文件夹大小,需要将文件夹内所有文件大小进行累加
File f1 = new File("D:\\aaa\\a.txt"); // 文件中有四个字
long len = f1.length();
System.out.println(len); // 12 (个字节)
File f2 = new File("D:\\aaa\\bbb");
long len2 = f2.length();
System.out.println(len2); // 0
// 2.getAbsolutePath 返回文件绝对路径
File f3 = new File("D:\\aaa\\a.txt");
String path1 = f3.getAbsolutePath();
System.out.println(path1); // D:\aaa\a.txt
// 当前路径下
File f4 = new File("java02\\a.txt");
String path2 = f4.getAbsolutePath();
System.out.println(path2); // C:\Users\123456\eclipse-workspace\java02\java02\a.txt
// 3.getPath 返回定义文件时使用的路径
File f5 = new File("D:\\aaa\\a.txt");
String path3 = f5.getPath();
System.out.println(path3); // D:\aaa\a.txt
// 当前路径下
File f6 = new File("java02\\a.txt");
String path4 = f6.getPath();
System.out.println(path4); // java02\a.txt
// 4.getName 获取文件名
// a :真正文件名
// txt : 文件扩展名
File f7 = new File("D:\\aaa\\a.txt");
String name = f7.getName();
System.out.println(name); // a.txt
// 5.lastModified 返回文件最后修改时间
File f8 = new File("D:\\aaa\\a.txt");
long time = f8.lastModified();
System.out.println(time); // 1667380952425 (毫秒值)
}
}
2. 创建与删除
方法名称 | 说明 |
public boolean createNewFile ( ) | 创建一个新的空的文件 |
public boolean mkdir ( ) | 创建单级文件夹 |
public boolean mkdirs ( ) | 创建多级文件夹 |
public boolean delete ( ) | 删除文件、空文件夹 |
注意:delete()方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站。
public class FileDemo04 {
public static void main(String[] args) throws IOException {
// 1. createNewFile 创建新的空的文件
// 细节1:如果当前路径表示文件时不存在的,则创建成功,返回true; 否则,返回false
// 细节2:如果父路径不存在,那么方法会有异常
// 细节3:创建的一定是文件,如果路径不包含后缀名,则是一个没有后缀的文件
File f1 = new File("D:\\aaa\\c.txt");
boolean b1 = f1.createNewFile();
System.out.println(b1);
// 2.mkidr 创建单级文件夹(目录)
// 细节1:windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
// 细节2:只能创建单级文件夹,无法创建多级文件夹
File f2 = new File("D:\\aaa\\ddd");
boolean b2 = f2.mkdir();
System.out.println(b2); // false
// 3.mkidrs 创建多级文件夹
// 细节: 既可以创建单级文件夹,也可以创建多级文件夹
File f3 = new File("D:\\aaa\\aaa\\bbb\\ccc");
boolean b3 = f3.mkdirs();
System.out.println(b3); // true
// 4.delete 删除文件、空文件夹
// 细节: 如果删除的是文件,则直接删除,不走回收站
// 如果删除的是空文件夹,则直接删除,不走回收站
// 如果删除的是有内容的文件夹,则删除失败
File f4 = new File("D:\\aaa\\a.txt");
boolean b4 = f4.delete();
System.out.println(b4);
}
}
3. 获取并遍历
方法名称 | 说明 |
public File [ ] listFiles ( ) | 获取当前该路径下所有内容 |
注意:
- 当调用者File表示的路径不存在时,返回null。
- 当调用者File表示的路径是文件时,返回null。
- 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组。
- 当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回。
- 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件。
- 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null。
public class FileDemo05 {
public static void main(String[] args) {
//1.创建file对象
File f = new File("D:\\aaa");
//2.调用方法
//作用:获取文件夹中所有内容,把所有的内容存放到数组并返回
File[] files = f.listFiles();
for (File file : files) {
//file依次表示文件夹中的每一个文件或者文件夹
System.out.println(file);
}
}
}
四、 综合练习
1. 练习一 : 创建文件
需求:在当前模块下的aaa文件夹中创建一个a.txt文件。(不需要考虑子文件夹)
public class FileTest {
public static void main(String[] args) throws IOException {
// 1.创建a.txt父级路径
File file = new File("java02\\aaa");
// 2.创建父级路径
// 如果aaa是存在的,那么此时创建失败
// 如果aaa是不存在的,那么此时创建成功
file.mkdirs();
// 3.拼接父级路径和子级路径
File src = new File(file, "a.txt");
boolean b = src.createNewFile();
if (b) {
System.out.println("创建成功");
} else {
System.out.println("创建失败");
}
}
}
2. 练习二 :单个文件夹查找文件
需求:定义一个方法找某一个文件夹中。是否有以avi结尾的电影。
public class FileTest {
public static void main(String[] args) throws IOException {
File file = new File("D:\\aaa");
boolean b = haveAvi(file);
System.out.println(b);
}
//作用: 用来找某个文件夹中,是否有以avi结尾的电影
//形参: 要查找的文件夹
//返回值:查找的结果
public static boolean haveAvi(File file) {
//1.进入文件夹,获取其中的所有的内容
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile() && f.getName().endsWith(".avi")) {
return true;
}
}
//循环结束,仍未找到
return false;
}
}
3. 练习三 :遍历硬盘查找文件
需求:找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
public class FileTest {
public static void main(String[] args) throws IOException {
File src = new File("C:\\");
findAvi(src);
}
public static void findAvi() {
// 获取本地所有的盘符
File[] arr = File.listRoots();
for (File f : arr) {
findAvi(f);
}
}
public static void findAvi(File file) {
// 1.进入文件夹
File[] files = file.listFiles();
// 2.遍历数组 得到file中每一个文件或文件夹
if (files != null) {
for (File f : files) { // files 可能为空指针
if (f.isFile()) {
// 3.判断: 是文件,执行业务逻辑
String name = f.getName();
if (name.endsWith(".avi")) {
System.out.println(f);
}
} else {
// 4.判断: 是文件夹,就可以递归
// 细节: 再次调用方法,参数必须是file的次一级
findAvi(f);
}
}
}
}
}
4. 练习四 :删除文件夹
需求:删除一个多级文件夹。
public class FileTest {
public static void main(String[] args) {
// 如果我们想要删除一个含有内容的文件夹?
// 1.先删除文件夹里面的所有的内容
// 2.再删除文件夹自己
File file = new File("D:\\aaa\\src");
delete(file);
// delete 只能删除文件和空的文件夹
}
// 作用:删除src文件夹
// 参数 : 要删除的文件夹
public static void delete(File src) {
// 1.先删除文件夹内所有文件
File[] files = src.listFiles();
for (File file : files) {
if (file.isFile()) {
file.delete();
} else {
delete(file);
}
}
// 2.再删除文件夹自己
src.delete();
}
}
5. 练习五 :统计文件夹大小
需求:统计一个文件夹的总大小。
public class FileTest {
public static void main(String[] args) {
File file = new File("D:\\aaa\\src");
long len = getLen(file);
System.out.println(len);
}
//作用:统计一个文件夹的大小
//形参: 要统计的文件夹
//返回值: 文件夹大小
public static long getLen(File src) {
long len = 0;
File[] files= src.listFiles();
for(File file : files) {
if (file.isFile()) {
len = len + file.length();
}else {
len = len + getLen(file);
}
}
return len;
}
}
6. 练习六 :统计各种文件数量
需求:需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
- txt:3个
- doc:4个
- jpg:6个
public class FileTest {
public static void main(String[] args) {
// 统计 : 计数器思想
File file = new File("D:\\aaa\\src");
Map<String, Integer> hm = getCount(file);
System.out.println(hm);
}
// 作用:统计一个文件夹中每种文件的个数
// 形参: 要统计的文件夹
// 返回值: 以用来统计的map集合(键:后缀名 值:次数)
public static Map<String, Integer> getCount(File src) {
// 定义集合用来统计
HashMap<String, Integer> hm = new HashMap<>();
// 进入src文件夹
File[] files = src.listFiles();
// 遍历
for (File file : files) {
if (file.isFile()) {
String name = file.getName();
String[] arr = name.split("\\.");
if (arr.length >= 2) {
String endName = arr[arr.length - 1];
if (hm.containsKey(endName)) {
// 存在
int count = hm.get(endName);
count++;
hm.put(endName, count);
} else {
// 不存在
hm.put(endName, 1);
}
}
} else {
// sonMap开麦女士子文件中每一种文件的个数
Map<String, Integer> sonMap = getCount(file);
Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
int value = entry.getValue();
if (hm.containsKey(key)) {
// 存在
int count = hm.get(key);
count = count + value;
hm.put(key, count);
} else {
// 不存在
hm.put(key, value);
}
}
}
}
return hm;
}
}