File
- File 对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径
- 这个路径可以是存在的,也允许是不存在的
| 方法名称 | 说明 |
|---|---|
| public File(String pathname) | 根据文件路径创建文件对象 |
| public File(String parent, String child) | 根据父路径名字符串和子路径名字符串创建文件对象 |
| public File(File parent, String child) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
package com.faxont.file;import java.io.File;public class FileDemo1 {public static void main(String[] args) {/*public File(String pathname) 根据文件路径创建文件对象public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象*/// 1. 根据字符串表示的路径,变成 File 对象String filePath = "D:\\java\\workspace\\a.txt";File file1 = new File(filePath);System.out.println(file1);// D:\java\workspace\a.txt// 2. 根据父路径和子路径,变成 File 对象// 父级路径:D:\java\workspace// 子级路径:a.txtString fileParent = "D:\\java\\workspace";String fileChild = "a.txt";File file2 = new File(fileParent, fileChild);System.out.println(file2);// D:\java\workspace\a.txt// 3. 根据父路径对应的 File 对象和子路径,变成 File 对象File fileParent2 = new File("D:\\java\\workspace");File file3 = new File(fileParent2, fileChild);System.out.println(file3);// D:\java\workspace\a.txt}
}
File 的常见成员方法
判断、获取
| 方法名称 | 说明 |
|---|---|
| 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() | 返回文件的最后修改时间(时间毫秒值) |
package com.faxont.file;import java.io.File;public class FileDemo2 {public static void main(String[] args) {/*public boolean isDirectory() 判断此路径名表示的 File 是否为文件夹public boolean isFile() 判断此路径名表示的 File 是否为文件public boolean exists() 判断此路径名表示的 File 是否存在*/// 1. 对一个文件夹的路径进行判断File f1 = new File("D:\\Java\\workspace");System.out.println(f1.isDirectory());System.out.println(f1.isFile());System.out.println(f1.exists());System.out.println("-----------------------------");// 2. 对一个文件的路径进行判断File f2 = new File("D:\\Java\\hadoop\\test.txt");System.out.println(f2.isDirectory());System.out.println(f2.isFile());System.out.println(f2.exists());System.out.println("-----------------------------");// 3. 对一个不存在的路径进行判断File f3 = new File("D:\\Java\\test.txt");System.out.println(f3.isDirectory());System.out.println(f3.isFile());System.out.println(f3.exists());}
}
package com.faxont.file;import java.io.File;
import java.text.SimpleDateFormat;public class FileDemo3 {public static void main(String[] args) {/*public long length() 返回文件的大小(字节数量)public String getAbsolutePath() 返回文件的绝对路径public String getPath() 返回定义文件时使用的路径public String getName() 返回文件的名称,带后缀public long lastModified() 返回文件的最后修改时间(时间毫秒值)*/// 1. length 返回文件的大小(字节数量)// 细节1:这个方法只能获取文件的大小,单位是字节// 细节2:这个方法无法获取文件夹的大小// 如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小累加在一起File f1 = new File("D:\\java\\hadoop\\test.txt");System.out.println(f1.length());File f2 = new File("D:\\java\\hadoop");System.out.println(f2.length());System.out.println("-----------------------------");// 2. getAbsolutePath() 返回文件的绝对路径File f3 = new File("D:\\java\\hadoop\\test.txt");System.out.println(f3.getAbsolutePath());File f4 = new File("file\\a.txt");System.out.println(f4.getAbsolutePath());System.out.println("-----------------------------");// 3. getPath() 返回定义文件时使用过的路径File f5 = new File("D:\\java\\hadoop\\test.txt");System.out.println(f5.getPath());File f6 = new File("file\\a.txt");System.out.println(f6.getPath());System.out.println("-----------------------------");// 4. getName() 获取文件的名称,带后缀// 细节1:// a.txt a 文件名 txt 后缀名、拓展名// 细节2:// 如果是文件夹,那么getName() 返回的就是文件夹的名称File f7 = new File("D:\\java\\hadoop\\test.txt");System.out.println(f7.getName());File f8 = new File("D:\\java\\hadoop");System.out.println(f8.getName());System.out.println("-----------------------------");// 5. lastModified() 返回文件的最后修改时间(时间毫秒值)File f9 = new File("D:\\java\\hadoop\\test.txt");System.out.println(f9.lastModified());File f10 = new File("file\\a.txt");System.out.println(f10.lastModified());// 将毫秒值转换为 日期 yyyy-MM-dd HH:mm:ssSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(sdf.format(f9.lastModified()));System.out.println(sdf.format(f10.lastModified()));}
}
创建、删除
| 方法名称 | 说明 |
|---|---|
| public boolean createNewFile() | 创建一个新的空文件 |
| public boolean mkdir() | 创建单级文件夹 |
| public boolean mkdirs() | 创建多级文件夹 |
| public boolean delete() | 删除文件、空文件夹 |
注意:delete 方法默认只能删除文件和空文件夹,delete 方法直接删除不走回收站
package com.faxont.file;import java.io.File;
import java.io.IOException;public class FileDemo4 {public static void main(String[] args) throws IOException {/*public boolean createNewFile() 创建一个新的空文件public boolean mkdir() 创建单级文件夹public boolean mkdirs() 创建多级文件夹public boolean delete() 删除文件、空文件夹*/// 1. 创建一个文件// 细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回 true// 如果当前路径表示的文件是存在的,则创建失败,方法返回 false// 细节2:如果父级路径是不存在的,那么方法会有异常// 细节3:createNewFile() 方法创建的一定是文件,如果路径中不包含后缀名,则返回一个没有后缀的文件File f1 = new File("D:\\Java\\workspace\\a.txt");System.out.println(f1.createNewFile());// 2. 创建单级文件夹// 细节1:Windows 当中路径是唯一的,如果当前路径已经存在,则创建失败,返回 false(例如,当前路径下有一个叫 test 的无后缀文件,我将无法再创建一个叫 test 的文件夹)// 细节2:mkdir 方法只能创建单级文件夹,无法创建多级文件夹File f2 = new File("D:\\Java\\workspace\\test");System.out.println(f2.mkdir());// 3. 创建多级文件夹// 细节:mkdirs 既可以创建单级文件夹,也可以创建多级文件夹File f3 = new File("D:\\Java\\workspace\\test\\a\\b\\c");System.out.println(f3.mkdirs());}
}
package com.faxont.file;import java.io.File;public class FileDemo5 {public static void main(String[] args) {/*public boolean delete() 删除文件、空文件夹细节:如果删除的是文件,则直接删除,不走回收站如果删除的是空文件夹,则直接删除,不走回收站如果删除的是非空文件夹,则不能删除,返回 false*/// 1. 创建 File 对象File f1 = new File("D:\\java\\workspace\\a.txt");// 2. 删除boolean b = f1.delete();System.out.println(b);}
}
获取并遍历
| 方法名称 | 说明 |
|---|---|
| public File[] listFiles() | 获取当前该路径下所有内容 |
注意:
- 当调用者 File 表示的路径不存在时,返回 null
- 当调用者 File 表示的路径是文件时,返回 null
- 当调用者 File 表示的路径是一个空文件夹时,返回一个长度为0的数组
- 当调用者 File 表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回
- 当调用者 File 表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回,包含隐藏文件
- 当调用者 File 表示的路径是需要权限才能访问的文件夹时,返回 null
package com.faxont.file;import java.io.File;public class FileDemo6 {public static void main(String[] args) {/*public File[] listFiles() 获取当前该路径下所有内容*/// 1. 创建 File 对象File f1 = new File("D:\\java\\workspace");// 2. listFiles() 方法// 作用:获取当前路径下文件夹里的所有内容File[] files = f1.listFiles();for (File file : files) {System.out.println(file);}}
}
| 方法名称 | 说明 |
|---|---|
| public static File[] listRoots() | 列出可用的文件系统根 |
| public String[] list() | 获取当前路径下所有内容 |
| public String[] list(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
| public File[] listFiles() | 获取当前该路径下所有内容 |
| public File[] listFiles(FileFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
| public File[] listFiles(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
package com.faxont.file;import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;public class FileDemo7 {public static void main(String[] args) {/*public static File[] listRoots() 列出可用的文件系统根public String[] list() 获取当前路径下所有内容public String[] list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容(掌握)public File[] listFiles() 获取当前该路径下所有内容public File[] listFiles(FileFilter filter) 利用文件名过滤器获取当前该路径下所有内容public File[] listFiles(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容*/// 1. listRoots 获取系统中所有的盘符File[] roots = File.listRoots();System.out.println(Arrays.toString(roots));// 2. list 获取当前路径下所有内容(仅能获取名字)File file = new File("D:\\java\\workspace");String[] names = file.list();for (String name : names) {System.out.println(name);}System.out.println("--------------------------------------------------------------------------------");// 3. list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容// 需求:我现在要获取 D:\\java\\hadoop 文件夹里面所有的 txt 文件/*** accept 方法的形参,依次表示 hadoop 文件夹里面每一个文件或者文件夹路径* 参数一:父级路径* 参数二:子级路径* 返回值:如果返回值为 true,就表示当前路径保留* 如果返回值为 false,就表示当前路径舍弃不要*/File file2 = new File("D:\\java\\hadoop");String[] list = file2.list(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {return new File(dir, name).isFile() && name.endsWith(".txt");}});
// String[] list = file2.list((dir, name) -> new File(dir, name).isFile() && name.endsWith(".txt"));for (String name : list) {System.out.println(name);}}
}
package com.faxont.file;import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;public class FileDemo8 {public static void main(String[] args) {/*(掌握)public File[] listFiles() 获取当前该路径下所有内容public File[] listFiles(FileFilter filter) 利用文件名过滤器获取当前该路径下所有内容public File[] listFiles(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容*/// 1. 创建 File 对象File file = new File("D:\\java\\hadoop");// 2. 需求:打印里面所有的 txt 文件File[] files = file.listFiles();for (File f : files) {// f 表示 D:\\java\\hadoop 文件夹里面每一个文件或者文件夹的路径if (f.isFile() && f.getName().endsWith(".txt")) {System.out.println(f);}}System.out.println("--------------------------------------------------------------------------------");// FileFilter 和 FilenameFilter 的区别:// FileFilter 是文件过滤器,FilenameFilter 是文件名过滤器// 接收的参数不同
// File[] listFiles = file.listFiles(new FileFilter() {
// @Override
// public boolean accept(File pathname) {
// return pathname.isFile() && pathname.getName().endsWith(".txt");
// }
// });File[] listFiles = file.listFiles(pathname -> pathname.isFile() && pathname.getName().endsWith(".txt"));for (File f : listFiles) {System.out.println(f);}System.out.println("--------------------------------------------------------------------------------");// 与之前的区别:listFiles 方法返回值是一个数组,而 list 方法返回值是一个字符串数组
// File[] listFiles2 = file.listFiles(new FilenameFilter() {
// @Override
// public boolean accept(File dir, String name) {
// return new File(dir, name).isFile() && name.endsWith(".txt");
// }
// });File[] listFiles2 = file.listFiles((dir, name) -> new File(dir, name).isFile() && name.endsWith(".txt"));for (File f : listFiles2) {System.out.println(f);}}
}
综合练习
File 类相关的 API 练习题
练习1
需求:
在当前模块下的 aaa 文件夹中创建一个 a.txt 文件
package com.faxont.test;import java.io.File;
import java.io.IOException;public class Test1 {public static void main(String[] args) throws IOException {/*在当前模块下的 aaa 文件夹中创建一个 a.txt 文件*/// 1. 创建 a.txt 的父级路径File file = new File("file\\aaa");if (!file.exists()) {file.mkdir();}// 2. 拼接父级路径和子级路径File src = new File(file, "a.txt");boolean b = src.createNewFile();if(b){System.out.println("创建成功");}else{System.out.println("创建失败");}}
}
练习2
需求:
定义一个方法,找某一个文件夹中是否有以sql结尾的文件(暂时不需要考虑子文件夹)
package com.faxont.test;import java.io.File;public class Test2 {public static void main(String[] args) {/*定义一个方法,找某一个文件夹中是否有以sql结尾的文件(暂时不需要考虑子文件夹)*/// 1. 创建 File 对象File file = new File("D:\\java\\workspace");File file2 = new File("D:\\java");// 2. 调用方法System.out.println(findFile(file));System.out.println(findFile(file2));}public static boolean findFile(File file){File[] files = file.listFiles();for (File f : files) {if (f.isFile() && f.getName().endsWith(".sql")) {return true;}}return false;}
}
练习3
需求:
定义一个方法,找某一个文件夹中是否有以sql结尾的文件(需要考虑子文件夹)
package com.faxont.test;import java.io.File;public class Test3 {public static void main(String[] args) {/*定义一个方法,找某一个文件夹中是否有以sql结尾的文件(需要考虑子文件夹)*/// 1. 创建 File 对象File file = new File("D:\\java\\workspace");File file2 = new File("D:\\java");// 2. 调用方法System.out.println(findFile(file));System.out.println(findFile(file2));}public static boolean findFile(File file){File[] files = file.listFiles();if (files != null) {for (File f : files) {if (f.isFile() && f.getName().endsWith(".sql")) {return true;}if (f.isDirectory()) {boolean b = findFile(f);if (b) {return true;}}}}return false;}
}
练习4
需求:
删除一个多级文件夹
package com.faxont.test;import java.io.File;public class Test4 {public static void main(String[] args) {/*删除一个多级文件夹*/// 1. 创建 File 对象File file = new File("D:\\java\\workspace\\test\\a");// 2. 调用方法System.out.println(deleteDir(file));}public static boolean deleteDir(File dir){File[] files = dir.listFiles();for (File f : files) {if (f.isFile()) {boolean delete = f.delete();if (!delete) {return false;}} else {boolean deleteDir = deleteDir(f);if (!deleteDir) {return false;}}}return dir.delete();}
}
练习5
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
package com.faxont.test;import java.io.File;
import java.util.HashMap;public class Test5 {public static void main(String[] args) {/*需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)打印格式如下:txt:3个doc:4个*/// 1. 创建 File 对象File file = new File("D:\\java\\hadoop");// 2. 创建 HashMap 集合,用于存储文件类型和文件个数HashMap<String, Integer> map = new HashMap<>();// 3. 调用方法countFile(file, map);map.forEach((k, v) -> System.out.println(k + ":" + v + "个"));}public static void countFile(File file, HashMap<String, Integer> map){File[] files = file.listFiles();if(files == null || files.length == 0){throw new SecurityException(file + "是空文件夹");}for (File f : files) {if(f.isFile()){String name = f.getName();int index = name.lastIndexOf(".");if(index == -1 || index == name.length() - 1){map.put("未知文件", map.getOrDefault("未知文件", 0) + 1);}else{String type = name.substring(index + 1);map.put(type, map.getOrDefault(type, 0) + 1);}}else{countFile(f, map);}}}
}
练习6
需求:统计一个文件夹的总大小
package com.faxont.test;import java.io.File;public class Test6 {public static void main(String[] args) {/*需求:统计一个文件夹的总大小*/// 1. 创建 File 对象File file = new File("D:\\java\\hadoop");// 2. 调用方法System.out.println(getTotalSize(file));}public static long getTotalSize(File file){File[] files = file.listFiles();long size = 0;for (File f : files) {if(f.isFile()){size += f.length();}else{size += getTotalSize(f);}}return size;}
}
