Java的IO流之File类
为什么要使用File类?
如果使用数组,变量在程序结束的时候,则所有数据就会丢失。计算机可以用硬盘实现对数据的永久存储,Java提供了一个对文件储存有关的类——File类。
什么是IO流?
- 可以将数据从本地文件中提取出来
- 可以将数据保存到本地文件
File的概述与构造方法
-
它是文件和目录路径名的抽象表示
-
文件和目录是可以通过File封装成对象的
-
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也可以是不存在的.将来是要通过具体的操作把这个路径的内容转换为具体存在的
方法名 | 说明 |
---|---|
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例 |
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例 |
public class FileDemo01 {
public static void main(String[] args) {
//File(String pathname):
//通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
File f1 = new File("C:\\Users\\Harmony\\Desktop\\Test\\a.txt");
System.out.println(f1);
//File(String parent, String child):
//从父路径名字符串和子路径名字符串创建新的 File实例
File f2 = new File("C:\\Users\\Harmony\\Desktop\\Test", "a.txt");
System.out.println(f2);
//File(File parent, String child):
//从父抽象路径名和子路径名字符串创建新的 File实例
File f3 = new File("C:\\Users\\Harmony\\Desktop\\Test");
File f4 = new File(f3, "a.txt");
System.out.println(f4);
}
}
File的创建功能
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 |
public boolean mkdir() | 创建由此抽象路径名命名的目录 |
public boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 |
(1)createNewFile()方法
public class FileDemo02 {
public static void main(String[] args) throws IOException {
File f1 = new File("C:\\Users\\Harmony\\Desktop\\Test\\a.txt");
boolean result = f1.createNewFile();
System.out.println(result);
}
}
注意点:
- 如果文件存在,则使用createNewFile()创建失败,返回false
- 如果文件不存在,则使用createNewFile()创建成功,返回true
- 不管调用者有没有后缀名,使用createNewFile()方法,只能创建文件。
(2)mkdir()与mkdirs()
public class FileDemo02 {
public static void main(String[] args) throws IOException {
File f2 = new File("C:\\Users\\Harmony\\Desktop\\Test\\A");
boolean res = f2.mkdir();
System.out.println(res);
}
}
注:其中"C:\\Users\\Harmony\\Desktop\\Test"目录是已经存在的!这里只是创建了一个A目录
注意点:
- 使用mkdir()方法只能创建单级文件夹(目录),不能创建多级文件夹(目录)。
- 不管是否有后缀名,只能创建文件夹(目录),不能创建文件!
public class FileDemo02 {
public static void main(String[] args) throws IOException {
File f2 = new File("C:\\Users\\Harmony\\Desktop\\Test\\A\\B\\C");
boolean res = f2.mkdirs();
System.out.println(res);
}
}
注意点:
- 使用mkdirs()方法既可以创建单级文件夹(目录),也可以创建多级文件夹(目录)。
- 不管是否有后缀名,只能创建文件夹(目录),不能创建文件!
显然mkdirs()的用途比mkdir()的要广泛!所以我们实际应用中基本上不适用mkdir() !
mkdirs()源码
public boolean mkdirs() {
if (exists()) {
return false;
}
if (mkdir()) {
return true;
}
File canonFile = null;
try {
canonFile = getCanonicalFile();
} catch (IOException e) {
return false;
}
File parent = canonFile.getParentFile();
return (parent != null && (parent.mkdirs() || parent.exists()) &&
canonFile.mkdir());
}
我们可以查看一下mkdirs的源码如上,其中第二个if就有调用mkdir方法。
File的删除功能
方法名 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
该方法可以删除文件或空目录
案例如下
public class FileDemo03 {
public static void main(String[] args) {
File f = new File("C:\\Users\\Harmony\\Desktop\\Test\\a.txt");
boolean result = f.delete();
System.out.println(result);
}
}
注意点
- 不会进入回收站
- 如果删除文件,那么直接删除;如果删除文件夹,那么只能删除空的文件夹
- 如果要删除一个有内容的文件夹,只有先进入到这个文件夹把里面的内容全部删除后,才能删除这个文件夹。
File类判断和获取功能
判断功能
方法名 | 说明 |
---|---|
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
public class FileDemo04 {
public static void main(String[] args) {
//创建一个File对象
File f = new File("myFile\\java.txt");
//public boolean isDirectory():测试此抽象路径名表示的File是否为目录
//public boolean isFile():测试此抽象路径名表示的File是否为文件
//public boolean exists():测试此抽象路径名表示的File是否存在
System.out.println(f.isDirectory());
System.out.println(f.isFile());
System.out.println(f.exists());
}
}
获取功能
方法名 | 说明 |
---|---|
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
public class FileDemo04 {
public static void main(String[] args) {
//创建一个File对象
File f = new File("myFile\\java.txt");
//public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
//public String getPath():将此抽象路径名转换为路径名字符串
//public String getName():返回由此抽象路径名表示的文件或目录的名称
System.out.println(f.getAbsolutePath());
System.out.println(f.getPath());
System.out.println(f.getName());
}
}
File类中的高级获取功能
public File[] listFiles() | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 |
进入文件夹,获取这个文件夹里面的所有文件与文件夹的File对象,并将其都放在一个数组中返回。
包括隐藏文件和隐藏文件夹都可以获取
public class FileDemo04 {
public static void main(String[] args) {
//创建一个File对象
File f = new File("myFile\\java.txt");
//public File[] listFiles():
//返回此抽象路径名表示的目录中的文件和目录的File对象数组
File f2 = new File("E:\\itcast");
File[] fileArray = f2.listFiles();
for(File file : fileArray) {
if(file.isFile()) {
System.out.println(file.getName());
}
}
}
}
注意点
在指定路径下创建文件(案例一)
详细题目
案例需求
在当前模块下的aaa文件夹中创建一个a.txt文件
实现步骤
创建File对象,指向aaa文件夹
判断aaa文件夹是否存在,如果不存在则创建
创建File对象,指向aaa文件夹下的a.txt文件
创建这个文件
Coding
public class Test1 {
public static void main(String[] args) throws IOException {
//注意点:文件所在的文件夹必须要存在.
//1.创建File对象,指向aaa文件夹
File file = new File("filemodule\\aaa");
//2.判断aaa文件夹是否存在,如果不存在则创建
if(!file.exists()){
//如果文件夹不存在,就创建出来
file.mkdirs();
}
//3.创建File对象,指向aaa文件夹下的a.txt文件
File newFile = new File(file,"a.txt");
//4.创建这个文件
newFile.createNewFile();
}
}
注意事项
createNewFile()方法只能创建文件,不能创建目录,所以不能保证指定的目录是否存在。先判断是否要先创建目录,再创建文件。
删除一个多级文件夹(案例二)
详细题目
案例需求
删除一个多级文件夹
实现步骤
定义一个方法,接收一个File对象
遍历这个File对象,获取它下边的每个文件和文件夹对象
判断当前遍历到的File对象是文件还是文件夹
如果是文件,直接删除
如果是文件夹,递归调用自己,将当前遍历到的File对象当做参数传递
参数传递过来的文件夹File对象已经处理完成,最后直接删除这个空文件夹
Coding
public class Test2 {
public static void main(String[] args) {
//练习二:删除一个多级文件夹
//delete方法
//只能删除文件和空文件夹.
//如果现在要删除一个有内容的文件夹?
//先删掉这个文件夹里面所有的内容.
//最后再删除这个文件夹
File src = new File("C:\\Users\\apple\\Desktop\\src");
deleteDir(src);
}
//1.定义一个方法,接收一个File对象
private static void deleteDir(File src) {
//先删掉这个文件夹里面所有的内容.
//递归 方法在方法体中自己调用自己.
//注意: 可以解决所有文件夹和递归相结合的题目
//2.遍历这个File对象,获取它下边的每个文件和文件夹对象
File[] files = src.listFiles();
//3.判断当前遍历到的File对象是文件还是文件夹
for (File file : files) {
//4.如果是文件,直接删除
if(file.isFile()){
file.delete();
}else{
//5.如果是文件夹,递归调用自己,将当前遍历到的File对象当做参数传递
deleteDir(file);//参数一定要是src文件夹里面的文件夹File对象
}
}
//6.参数传递过来的文件夹File对象已经处理完成,最后直接删除这个空文件夹
src.delete();
}
}
注意事项
使用递归的方式删除层级目录。注意点与上一个案例的问题类似。
统计一个文件夹中每种文件的个数并打印(案例三)
详细题目
统计一个文件夹中每种文件的个数并打印
打印格式如下:
txt:3个
doc:4个
jpg:6个
…
实现步骤
定义一个方法,参数是HashMap集合用来统计次数和File对象要统计的文件夹
遍历File对象,获取它下边的每一个文件和文件夹对象
判断当前File对象是文件还是文件夹
如果是文件,判断这种类型文件后缀名在HashMap集合中是否出现过
没出现过,将这种类型文件的后缀名存入集合中,次数存1
出现过,获取这种类型文件的后缀名出现的次数,对其+1,在存回集合中
如果是文件夹,递归调用自己,HashMap集合就是参数集合,File对象是当前文件夹对象
Coding
public class Test3 {
public static void main(String[] args) {
//统计一个文件夹中,每种文件出现的次数.
//统计 --- 定义一个变量用来统计. ---- 弊端:同时只能统计一种文件
//利用map集合进行数据统计,键 --- 文件后缀名 值 ---- 次数
File file = new File("filemodule");
HashMap<String, Integer> hm = new HashMap<>();
getCount(hm, file);
System.out.println(hm);
}
//1.定义一个方法,参数是HashMap集合用来统计次数和File对象要统计的文件夹
private static void getCount(HashMap<String, Integer> hm, File file) {
//2.遍历File对象,获取它下边的每一个文件和文件夹对象
File[] files = file.listFiles();
for (File f : files) {
//3.判断当前File对象是文件还是文件夹
if(f.isFile()){
//如果是文件,判断这种类型文件后缀名在HashMap集合中是否出现过
String fileName = f.getName();
String[] fileNameArr = fileName.split("\\.");
if(fileNameArr.length == 2){
String fileEndName = fileNameArr[1];
if(hm.containsKey(fileEndName)){
//出现过,获取这种类型文件的后缀名出现的次数,对其+1,在存回集合中
Integer count = hm.get(fileEndName);
//这种文件又出现了一次.
count++;
//把已经出现的次数给覆盖掉.
hm.put(fileEndName,count);
}else{
// 没出现过,将这种类型文件的后缀名存入集合中,次数存1
hm.put(fileEndName,1);
}
}
}else{
//如果是文件夹,递归调用自己,HashMap集合就是参数集合,File对象是当前文件夹对象代码实现
getCount(hm,f);
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)