File
思考:我们可以对硬盘进行哪些操作?
读、写
IO就可以对硬盘中的文件进行读写
1.可以将数据从本地文件中读出来
2.可以将数据从内存保存到本地文件
File表示要读写的文件在哪儿,也可以对文件进行创建、删除等操作
1.在读写数据时告诉虚拟机要操作的(文件/文件夹)在哪儿
2.对(文件/文件夹)本身进行操作,包括创建、删除等等
File类
File类介绍
-
它是文件和目录路径名的抽象表示
-
文件和目录是可以通过File封装成对象的
-
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也可以是不存在的.将来是要通过具体的操作把这个路径的内容转换为具体存在的
-
File类的构造方法
方法名 说明 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例 File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例 -
示例代码
package com.cloudcore.filetest;
import java.io.File;
/**
* @Author: hepeng
* @Date: 2021/10/11 22:26
*/
public class FileDemo1 {
public static void main(String[] args) {
method1();
method2();
method3();
}
private static void method3() {
//File(File parent, String child): 从父抽象路径名和子路径名字符串创建新的 File实例
File file1 = new File("F:\\itheima");
String document = "a.txt";
File file = new File(file1,document);
System.out.println(file);
}
private static void method2() {
//File(String parent, String child): 从父路径名字符串和子路径名字符串创建新的 File实例
String path = "F:\\itheima";
String document = "a.txt";
File file = new File(path,document);
System.out.println(file);
//F:\itheima\a.txt
}
private static void method1() {
//File(String pathname): 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
String path = "F:\\itheima\\a.txt";
File file = new File(path);
//问题:为什么要把字符串形式表示的路径变成File对象?
//就是为了使用File类里面的方法
System.out.println(file);
//F:\itheima\a.txt
}
}
绝对路径和相对路径
-
绝对路径
是一个完整的路径,从盘符开始
File file = new File("F:\\itheima\\a.txt");
-
相对路径
是一个简化的路径,相对当前项目下的路径
File file1 = new File("a.txt"); File file2 = new File("模块名\\a.txt");
File类创建功能【应用】
创建方法
-
方法分类
方法名 说明 public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir() 创建由此抽象路径名命名的目录 public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 -
示例代码
package com.cloudcore.filetest;
import java.io.File;
import java.io.IOException;
/**
* @Author: hepeng
* @Date: 2021/10/11 22:47
*/
public class FileDemo3 {
public static void main(String[] args) throws IOException {
//public boolean createNewFile() 创建一个新的空的文件
method1();
//public boolean mkdir() 创建一个单级文件夹
method2();
//public boolean mkdirs() 创建多级文件夹
method3();
}
private static void method3() {
//public boolean mkdirs() 创建多级文件夹
File file = new File("F:\\itheima\\ccc\\ddd\\hhh");
boolean mkdirs = file.mkdirs();
System.out.println(mkdirs);
//注意点:
//1.可以创建单级文件夹也可以创建多级文件夹
//2.不管调用者有没有后缀,只能创建文件夹
}
private static void method2() {
//public boolean mkdir() 创建一个单级文件夹
File file = new File("F:\\itheima\\aaa");
boolean result = file.mkdir();
System.out.println(result);
//注意点:
//1.只能创建单级文件夹,不能创建多级文件夹
//2.不管调用者有没有后缀,只能创建文件夹
}
private static void method1() throws IOException {
//public boolean createNewFile() 创建一个新的空的文件
File file = new File("F:\\itheima\\a.txt");
boolean result = file.createNewFile();
System.out.println(result);
//注意点:
//1.如果文件存在,创建失败返回false
//2.如果文件不存在,创建成功,返回true
//3.createNewFile不管调用者有没有后缀只能创建文件
}
}
疑问
既然mkdirs既可以创建单级文件夹也可以创建多级文件夹,那么还要mkdir有何用?
是的,以后直接使用mkdirs
删除方法
-
方法分类
方法名 说明 public boolean delete() 删除由此抽象路径名表示的文件或目录 -
示例代码
package com.cloudcore.filetest;
import java.io.File;
/**
* @Author: hepeng
* @Date: 2021/10/11 23:01
*/
public class FileDemo4 {
public static void main(String[] args) {
//public boolean delete()
method1();
//注意点:
//1.用delete删除是不走回收站的
//2.可以删除文件或者文件夹
//3.如果删除的是文件,那么直接删除
// 如果删除的是文件夹,只能删除空文件夹
//4.如果想要删除一个有内容的文件夹,只能先进入到这个文件夹,把里面内容全部删除完毕,才能再次删除这个文件夹
File file = new File("F:\\itheima\\aaa");
boolean result = file.delete();
System.out.println(result);
}
private static void method1() {
//public boolean delete()
File file = new File("F:\\itheima\\a.txt");
boolean result = file.delete();
System.out.println(result);
}
}
File类判断和获取功能
-
判断功能
方法名 说明 public boolean isDirectory() 测试此抽象路径名表示的File是否为目录 public boolean isFile() 测试此抽象路径名表示的File是否为文件 public boolean exists() 测试此抽象路径名表示的File是否存在 -
获取功能
方法名 说明 public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 public String getPath() 将此抽象路径名转换为路径名字符串 public String getName() 返回由此抽象路径名表示的文件或目录的名称 public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组 -
示例代码
package com.cloudcore.filetest;
import java.io.File;
/**
* @Author: hepeng
* @Date: 2021/10/12 20:34
*/
public class FileDemo5 {
public static void main(String[] args) {
//public boolean isDirectory() 判断是否为目录
//public boolean isFile() 判断是否为文件
method1();
//public boolean exists() 判断file是否存在
method2();
//public String getName() 返回由此抽象路径名表示的文件或目录的名称
//注意点:
//1.如果调用者是文件,那么获取的是文件名和后缀名
//2.如果调用者是一个文件夹,那么获取的是问价夹的名称
File file = new File("a.txt");
String name = file.getName();
System.out.println(name);//a.txt
File files = new File("F:\\itheima");
String name1 = files.getName();
System.out.println(name1);//itheima
}
private static void method2() {
//当前项目下的a.txt
File file = new File("a.txt");
boolean result = file.exists();
System.out.println(result);
}
private static void method1() {
File file = new File("F:\\itheima\\a.txt");
boolean directory = file.isDirectory();
boolean files = file.isFile();
System.out.println(directory);//false
System.out.println(files);//true
}
}
listFiles()
public class FileDemo6 {
public static void main(String[] args) {
File file = new File("D:\\");
File[] files = file.listFiles();
for (File path : files) {
System.out.println(path);
}
//进入文件夹,获取这个文件夹里面所有的问价和文件夹的File对象,并把这些File对象都放在一个数组中返回
//包括隐藏问价和隐藏文件夹都可以获取
//注意事项
//1.当调用者是一个文件时,返回一个null
//2.当调用者是一个空文件夹时,会返回一个长度为0的数组
//3.当调用者是一个有内容的文件夹时,会进入这个文件夹获取里面所有的文件
//4.当调用者是一个有权限才能进入的文件夹时,也会返回null
}
}
小练习
练习一:在当前模块下的aaa文件夹中创建一个a.txt文件
public class FileTest1 {
public static void main(String[] args) throws IOException {
//练习一:在当前模块下的aaa文件夹中创建一个a.txt文件
//注意点:
//文件所在的文件夹必须要存在,否则就会报错
File file = new File("file_io\\aaa");
if (!file.exists()){
//如果文件夹不存在我们就创建
file.mkdirs();
}
File newFile = new File(file,"a.txt");
newFile.createNewFile();
}
}
练习二:删除一个多级文件夹
-
案例需求
删除一个多级文件夹
-
实现步骤
- 定义一个方法,接收一个File对象
- 遍历这个File对象,获取它下边的每个文件和文件夹对象
- 判断当前遍历到的File对象是文件还是文件夹
- 如果是文件,直接删除
- 如果是文件夹,递归调用自己,将当前遍历到的File对象当做参数传递
- 参数传递过来的文件夹File对象已经处理完成,最后直接删除这个空文件夹
-
代码实现
public class FileTest2 {
public static void main(String[] args) {
//练习二:删除一个多级文件夹
File src = new File("F:\\itheima\\ccc\\ddd\\hhh");
deleteDir(src);
}
private static void deleteDir(File src) {
//先删除所有内容
//递归 方法在方法体中自己调用自己
//1.进入
File[] files = src.listFiles();
//2.遍历
for (File file : files) {
if(file.isFile()){
//3.判断 如果遍历到的是一个文件直接删除
file.delete();
}else {
//4.判断 如果是文件夹递归
deleteDir(file);
}
}
//最后再删除这个文件夹
src.delete();
}
}
练习三:统计一个文件夹中,每种文件出现的次数.
-
案例需求
统计一个文件夹中每种文件的个数并打印
打印格式如下:
txt:3个 doc:4个 jpg:6个 …
-
实现步骤
- 定义一个方法,参数是HashMap集合用来统计次数和File对象要统计的文件夹
- 遍历File对象,获取它下边的每一个文件和文件夹对象
- 判断当前File对象是文件还是文件夹
- 如果是文件,判断这种类型文件后缀名在HashMap集合中是否出现过
- 没出现过,将这种类型文件的后缀名存入集合中,次数存1
- 出现过,获取这种类型文件的后缀名出现的次数,对其+1,在存回集合中
- 如果是文件夹,递归调用自己,HashMap集合就是参数集合,File对象是当前文件夹对象
-
代码实现
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);
}
}
}
}