1.概述
java.io.File
类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
2.构造方法
public File(String pathname)
:通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。
public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。构造举例,代码如下:
package File;
import java.io.File;
/*
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
*/
public class demo1 {
public static void main(String[] args) {
String str="C:\\Users\\ch200\\OneDrive\\桌面\\1.txt";
//1.根据字符串表示的路径,变成File对象
File f1= new File(str);
System.out.println(f1);
//2.父级路径:C:\Users\ch200\OneDrive\桌面
//子级路径:1.txt
String parent = "C:\\Users\\ch200\\OneDrive\\桌面";
String child = "1.txt";
File f2 = new File(parent,child);
System.out.println(f2);//C:\Users\ch200\OneDrive\桌面\1.txt
File f3= new File(parent+"\\"+child);
System.out.println(f3);
// 通过父级File对象和子路径字符串
File f4=new File("C:\\Users\\ch200\\OneDrive\\桌面");
String s="1.txt";
File f5=new File(f4,s);
System.out.println(f5);
}
}
public String getAbsolutePath()
:返回此File的绝对路径名字符串。
public String getPath()
:将此File转换为路径名字符串。
public String getName()
:返回由此File表示的文件或目录的名称。
public long length()
:返回由此File表示的文件的长度。
package File;
import java.io.File;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
/*
public long length() 返回文件的大小(字节数量)
public String getAbsolutePath() 返回文件的绝对路径
public String getPath() 返回定义文件时使用的路径
public String getName() 返回文件的名称,带后缀
public long lastModified() 返回文件的最后修改时间(时间毫秒值)
*/
public class demo3 {
public static void main(String[] args) {
//1.length 返回文件的大小(字节数量)
//细节1:这个方法只能获取文件的大小,单位是字节
//如果单位我们要是M,G,可以不断的除以1024
//细节2:这个方法无法获取文件夹的大小
//如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小都累加在一起。
File f1=new File("D:\\Java学习\\a.txt");
System.out.println(f1.length());//9字节
File f2=new File("D:\\Java学习\\bbb");
System.out.println(f2.length());
System.out.println("--------------------");
//2.getAbsolutePath 返回文件的绝对路径
File f3 = new File("D:\\Java学习\\a.txt");
String path1 = f3.getAbsolutePath();
System.out.println(path1);
File f4 = new File("day45\\a.txt");
String path2 = f4.getAbsolutePath();
System.out.println(path2);
System.out.println("====================================");
//3.getPath 返回定义文件时使用的路径
File f5 = new File("D:\\Java学习\\a.txt");
String path3 = f5.getPath();
System.out.println(path3);
File f6 = new File("day45\\a.txt");
String path4 = f6.getPath();
System.out.println(path4);
System.out.println("====================================");
//4.getName 获取名字
//细节1:
//a.txt:
// a 文件名
// txt 后缀名、扩展名
//细节2:
//文件夹:返回的就是文件夹的名字
File f7 = new File("D:\\Java学习\\a.txt");
String name1 = f7.getName();
System.out.println(name1);
File f8 = new File("D:\\Java学习\\bbb");
String name2 = f8.getName();
System.out.println(name2);//bbb
System.out.println("====================================");
//5.lastModified 返回文件的最后修改时间(时间毫秒值)
File f9 = new File("D:\\Java学习\\a.txt");
long time = f9.lastModified();
System.out.println(time);//1667380952425
System.out.println("====================================");
//如何把时间的毫秒值变成字符串表示的时间呢?
//课堂练习:
//yyyy年MM月dd日 HH:mm:ss
Date d=new Date(1667380952425l);
DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = df.format(d);
System.out.println(str);
}
}
public boolean exists()
:此File表示的文件或目录是否实际存在。
public boolean isDirectory()
:此File表示的是否为目录。
public boolean isFile()
:此File表示的是否为文件。
package File;
import java.io.File;
/*
public boolean isDirectory() 判断此路径名表示的File是否为文件夹
public boolean isFile() 判断此路径名表示的File是否为文件
public boolean exists() 判断此路径名表示的File是否存在
*/
public class demo2 {
public static void main(String[] args) {
//1.对一个文件的路径进行判断
File f1=new File("D:\\Java学习\\a.txt");
System.out.println(f1.isDirectory());
System.out.println(f1.exists());
System.out.println(f1.isFile());
System.out.println("----------------------------");
//2.对一个文件夹的路径进行判断
File f2=new File("D:\\Java学习\\bbb");
System.out.println(f2.isDirectory());
System.out.println(f2.exists());
System.out.println(f2.isFile());
System.out.println("----------------------------");
//3.对一个不存在的路径进行判断
File f3 = new File("D:\\Java学习\\1.txt");
System.out.println(f3.isDirectory());//false
System.out.println(f3.isFile());//false
System.out.println(f3.exists());//false
}
}
创建删除功能的方法
public boolean createNewFile()
:当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete()
:删除由此File表示的文件或目录。
public boolean mkdir()
:创建由此File表示的目录。
public boolean mkdirs()
:创建由此File表示的目录,包括任何必需但不存在的父目录。
package File;
import java.io.File;
import java.io.IOException;
/*
public boolean createNewFile() 创建一个新的空的文件
public boolean mkdir() 创建单级文件夹
public boolean mkdirs() 创建多级文件夹
public boolean delete() 删除文件、空文件夹
*/
public class demo4 {
public static void main(String[] args) throws IOException {
//1.createNewFile 创建一个新的空的文件
//细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true
// 如果当前路径表示的文件是存在的,则创建失败,方法返回false
//细节2:如果父级路径是不存在的,那么方法会有异常IOException
//细节3:createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件
File f1=new File("D:\\Java学习\\r");
boolean newFile = f1.createNewFile();
System.out.println(newFile);
//2.mkdir make Directory,文件夹(目录)
//细节1:windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
//细节2:mkdir方法只能创建单级文件夹,无法创建多级文件夹。
File f2 = new File("D:\\Java学习\\hhh");
boolean b = f2.mkdir();
System.out.println(b);
//3.mkdirs 创建多级文件夹
//细节:既可以创建单级的,又可以创建多级的文件夹
File f3 = new File("D:\\Java学习\\aaa\\bbb");
boolean b2 = f3.mkdirs();
System.out.println(b2);//true
}
}
package File;
import java.io.File;
public class demo5 {
public static void main(String[] args) {
/*
public boolean delete() 删除文件、空文件夹
细节:
如果删除的是文件,则直接删除,不走回收站。
如果删除的是空文件夹,则直接删除,不走回收站
如果删除的是有内容的文件夹,则删除失败
*/
//1.创建File对象
File f1 = new File("D:\\Java学习\\hhh");
//2.删除
boolean b = f1.delete();
System.out.println(b);
}
}
目录的遍历
-
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。 -
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
package File;
import java.io.File;
public class demo65 {
public static void main(String[] args) {
//public File[] listFiles() 获取当前该路径下所有内容
//1.创建File对象
File f = new File("D:\\Java学习");
//2.listFiles方法
//作用:获取aaa文件夹里面的所有内容,把所有的内容放到数组中返回
File[] files = f.listFiles();
for (File file : files) {
//file依次表示Java学习文件夹里面的每一个文件或者文件夹
if (file.isFile() && file.getName().endsWith(".txt")) {
System.out.println(file);
}
}
}
}
3.练习
练习1:创建文件夹
在当前模块下Java学习文件夹中创建一个vv.txt文件
package lx;
import java.io.File;
import java.io.IOException;
public class demo1 {
public static void main(String[] args) throws IOException {
//在当前模块下的aaa文件夹中创建一个a.txt文件
//需求:在当前模块下的aaa文件夹中创建一个a.txt文件
//1.创建a.txt的父级路径
File f1 = new File("aaa");
//2.创建父级路径
//如果aaa是存在的,那么此时创建失败的。
//如果aaa是不存在的,那么此时创建成功的。
//创建多级文件夹
f1.mkdirs();
//3.拼接父级路径和子级路径
File f2 = new File(f1,"a.txt");
boolean b = f2.createNewFile();
if(b){
System.out.println("创建成功");
}else{
System.out.println("创建失败");
}
}
}
练习2:查找文件(不考虑子文件夹)
定义一个方法找某一个文件夹中,是否有以txt结尾的的电影(暂时不需要考虑子文件夹)
package lx;
import java.io.File;
public class demo2 {
//定义一个方法找某一个文件夹中,是否有以txt结尾的(暂时不需要考虑子文件夹)文件
public static void main(String[] args) {
File f1 = new File("D:\\Java学习\\aaa");
boolean b = haveTxt(f1);
System.out.println(b);
}
/*
* 作用:用来找某一个文件夹中,是否有以txt结尾
* 形参:要查找的文件夹
* 返回值:查找的结果 存在true 不存在false
* */
public static boolean haveTxt(File f1) {
//1.进入aaa文件夹,而且要获取里面所有的内容
File[] files = f1.listFiles();
for (File file : files) {
if(file.isFile() && file.getName().endsWith(".txt")) {
return true;
}
}
//3.如果循环结束之后还没有找到,直接返回false
return false;
}
}
练习3:(考虑子文件夹)
找到电脑中所有以txt结尾。(需要考虑子文件夹)
package lx;
import java.io.File;
public class demo3 {
public static void main(String[] args) {
/* 需求:
找到电脑中所有以txt结尾的文件。(需要考虑子文件夹)
套路:
1,进入文件夹
2,遍历数组
3,判断
4,判断
*/
findTXT();
}
public static void findTXT() {
//获取本地所有的盘符
File[] arr = File.listRoots();
for (File f : arr) {
findTXT(f);
}
}
public static void findTXT(File src) {//"C:\\
//1.进入文件夹src
File[] files = src.listFiles();
//2.遍历数组,依次得到src里面每一个文件或者文件夹
if (files != null) {
for (File file : files) {
if (file.isFile()) {
//3,判断,如果是文件,就可以执行题目的业务逻辑
String name = file.getName();
if (name.endsWith(".txt")) {
System.out.println(file);
}
} else {
//4,判断,如果是文件夹,就可以递归
//细节:再次调用本方法的时候,参数一定要是src的次一级路径
findTXT(file);
}
}
}
}
}
package lx;
import java.io.File;
public class demo3 {
public static void main(String[] args) {
/* 需求:
找到电脑中所有以txt结尾的文件。(需要考虑子文件夹)
套路:
1,进入文件夹
2,遍历数组
3,判断
4,判断
*/
findTXT();
}
public static void findTXT() {
//获取本地所有的盘符
File[] arr = File.listRoots();
for (File f : arr) {
findTXT(f);
}
}
public static void findTXT(File src) {//"C:\\
//1.进入文件夹src
File[] files = src.listFiles();
//2.遍历数组,依次得到src里面每一个文件或者文件夹
if (files != null) {
for (File file : files) {
if (file.isFile()) {
//3,判断,如果是文件,就可以执行题目的业务逻辑
String name = file.getName();
if (name.endsWith(".txt")) {
System.out.println(file);
}
} else {
//4,判断,如果是文件夹,就可以递归
//细节:再次调用本方法的时候,参数一定要是src的次一级路径
findTXT(file);
}
}
}
}
}
练习4:删除多级文件夹
需求: 如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
代码示例:
package lx;
import java.io.File;
public class demo4 {
public static void main(String[] args) {
/*
删除一个多级文件夹
如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
*/
File file = new File("D:\\Java学习\\bbb");
DealTXT(file);
}
/*
* 作用:删除src文件夹
* 参数:要删除的文件夹
* */
public static void DealTXT(File src) {//"C:\\
//1.进入文件夹src
File[] files = src.listFiles();
//2.遍历数组,依次得到src里面每一个文件或者文件夹
if (files != null) {
for (File file : files) {
//判断,如果是文件,删除
if (file.isFile()) {
file.delete();
} else {
//4,判断,如果是文件夹,就可以递归
//细节:再次调用本方法的时候,参数一定要是src的次一级路径
//判断,如果是文件夹,就递归
DealTXT(file);
}
}
//2.再删除自己
src.delete();
}
}
}
分析:
1.首先进入src文件夹,创建数组记录获取当前该路径下所有内容,内容是a.txt,b.txt,aaa文件夹,第一次循环遍历scr文件夹里面的内容,file依次表示该文件夹里面的每一个文件或者文件夹。先判断file这个文件是否存在,如果存在则直接删除,显然这里的a.txt,b.txt存在所以删除了,如果不存在就递归,
2.然后看第二副图,显然这里的形参为aaa文件夹,循环遍历,这里的file依次表示该文件夹里面的每一个文件或者文件夹,也就是aa.txt和空文件夹,循环判单删除了aa.txt文件,
3.第三幅图,显然这里的形参是空文件夹,此时数组的长度为0,循环判断进不去,就直接删除了空的文件夹,然后递归往返,
4.递归往返,先删除了aaa文件夹,然后删除了src文件
练习5:统计大小
需求:统计一个文件夹的总大小
package lx;
import java.io.File;
public class demo5 {
public static void main(String[] args) {
/*需求:
统计一个文件夹的总大小
*/
File file=new File("D:\\Java学习\\aaa");
long len = getLen(file);
System.out.println(len);
}
private static long getLen(File file) {
long len = 0;
if(file!=null){
//进入file文件夹
File[] files=file.listFiles();
for(File f:files){
if(f.isFile()){
len+=f.length();
}else{
len+=getLen(f);
}
}
}
return len;
}
}
分析:
1.首先创建数组循环遍历scr下的文件,如a.txt,b.txt,a文件夹,第一次循环遍历累加的就是把a.txt,b.txt的字节累加在一起,第二次进入循环,递归了一下,把a文件夹的所有的文本文件累加在一起,最后返回给了第一次循环遍历的结果
练习6:统计文件个数
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹) 打印格式如下: txt:3个 doc:4个 jpg:6个
package lx;
import java.io.File;
import java.util.HashMap;
public class demo7 {
static HashMap<String, Integer> hm = new HashMap<>();
public static void main(String[] args) {
/*
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
*/
File file = new File("D:\\Java学习\\aaa");
HashMap<String, Integer> hm = getCount(file);
System.out.println(hm);
}
/*
* 作用:
* 统计一个文件夹中每种文件的个数
* 参数:
* 要统计的那个文件夹
* 返回值:
* 用来统计map集合
* 键:后缀名 值:次数
*/
private static HashMap<String, Integer> getCount(File src) {
//进入src文件夹
File[] files = src.listFiles();
//循环遍历每一个文件
for (File file : files) {
//file代表的就是每一个文件
//判断,如果是文件,统计
if (file.isFile()) {
//先获取每一个文件名
String name = file.getName();
//再获取每一个文件的后缀
String[] arr = name.split("\\.");
//这里的arr.length就是以.为分割,文件的长度,如1.txt的就是 1和txt,数组长度为2
//为3的就是 1.txt.obj ---1 和txt 和obj
if (arr.length >= 2) {
//获取结尾的后缀
String endName = arr[arr.length - 1];
//在hm集合里查看这个后缀有吗
if (hm.containsKey(endName)) {
//存在count++
//通过键获取值 也就是通过后缀名来计算出改文件有多少个
int count = hm.get(endName);
//最后把改文件以及次数添加在hm集合当中
hm.put(endName, count + 1);
} else {
//不存在count为1
//说明改文件的次数就一个,直接添加在集合当中即可
hm.put(endName, 1);
}
}
} else {
//如果不是文件,是文件夹,则递归
//细节:再次调用本方法的时候,参数一定要是src的次一级路径
//用来统计子文件夹的文件个数
//递归来累计子文件夹里的文件个数最后添加在hm集合当中
getCount(file);
}
}
return hm;
}
}