1. File类的概述和构造方法
-
File类的概述
-
File更应该叫做一个路径
-
文件路径或者文件夹路径
-
路径分为绝对路径和相对路径
-
绝对路径是一个固定的路径,从盘符开始
-
相对路径相对于某个位置,在eclipse下是指当前项目下,在dos下
-
-
-
查看API指的是当前路径
-
文件和目录路径名的抽象表示形式
-
-
构造方法
-
File(String pathname):根据一个路径得到File对象
-
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
-
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
-
-
案例演示
-
File类的构造方法
-
package com.heima.file; import java.io.File; public class Demo1_File { /** * @param args */ public static void main(String[] args) { File file1 = new File("D:\JAVA\01 JAVA基础\day19\day19\code\day19\src\com\heima\file\Demo1_File.java"); System.out.println(file1.exists()); File file2 = new File("xxx.txt"); System.out.println(file2.exists()); File Parent = new File("D:\JAVA\01 JAVA基础\day19\day19\code\day19\src\com\heima\file"); String child = "Demo1_File.java"; File file3 = new File(Parent, child); System.out.println(file3.exists()); String parent = "D:\JAVA\01 JAVA基础\day19\day19\code\day19\src\com\heima\file"; String child2 = "Demo1_File.java"; File file4 = new File(Parent, child2); System.out.println(file4.exists()); } }
-
2. File类的创建功能
-
创建功能
-
public boolean createNewFile():创建文件,如果存在这样的文件,就不创建了
-
public boolean mkdir():创建文件夹,如果存在这样的文件夹,就不创建了
-
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
-
-
案例演示
-
File类的创建功能
-
package com.heima.file; import java.io.File; import java.io.IOException; public class Demo2_File { /** public boolean createNewFile():创建文件,如果存在这样的文件,就不创建了 public boolean mkdir():创建文件夹,如果存在这样的文件夹,就不创建了 public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来 * @throws IOException */ public static void main(String[] args) throws IOException { File file1 = new File("test"); System.out.println(file1.mkdir()); File file2 = new File("test\a\b\c"); System.out.println(file2.mkdirs()); File file3 = new File("test\a\b\c\t1.txt"); System.out.println(file3.createNewFile()); // 需要ctrl+1,throws IOException } }
-
注意事项:
-
如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
-
-
3. File类的重命名和删除功能
-
重命名和删除功能
-
public boolean renameTo(File dest):把文件重命名为指定的文件路径
-
public boolean delete():删除文件或者文件夹
-
-
重命名注意事项
-
如果路径名相同,就是改名。
-
如果路径名不同,就是改名并剪切。
-
-
删除注意事项:
-
Java中的删除不走回收站。
-
要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
-
-
package com.heima.file; import java.io.File; import java.io.IOException; public class Demo3_File { /** 重命名和删除功能 public boolean renameTo(File dest):把文件重命名为指定的文件路径 public boolean delete():删除文件或者文件夹 * @throws IOException */ public static void main(String[] args) throws IOException { // demo1(); File file1 = new File("a/b/c/d"); File file2 = new File("a/b/c/d/test.txt"); if(!file1.exists()) { file1.mkdir(); } if (!file2.exists()) { file2.mkdirs(); } System.out.println(file1.exists()); System.out.println(file1.delete()); // Java中的删除不走回收站。 // 要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹 } public static void demo1() throws IOException { File file1 = new File("xxx.txt"); File file2 = new File("ooo.txt"); if (!file1.exists()) { file1.createNewFile(); } else { file1.delete(); file1.createNewFile(); } if (file2.exists() && file1.exists()) { file2.delete(); System.out.println(file1.renameTo(file2)); } } }
4. File类的判断功能
-
判断功能
-
public boolean isDirectory():判断是否是目录
-
public boolean isFile():判断是否是文件
-
public boolean exists():判断是否存在
-
public boolean canRead():判断是否可读
-
public boolean canWrite():判断是否可写
-
public boolean isHidden():判断是否隐藏
-
-
案例演示
-
File类的判断功能
-
package com.heima.file; import java.io.File; public class Demo4_File { /** public boolean isDirectory():判断是否是目录 public boolean isFile():判断是否是文件 public boolean exists():判断是否存在 public boolean canRead():判断是否可读 public boolean canWrite():判断是否可写 public boolean isHidden():判断是否隐藏 */ public static void main(String[] args) { File dir1 = new File("a"); File file1 = new File("ooo.txt"); System.out.println("查看文件file1和目录dir1是否是文件和目录"); System.out.println(dir1.isDirectory()); // true System.out.println(file1.isFile()); // true System.out.println("查看文件file1是否可读可写"); System.out.println(file1.canRead()); // true System.out.println(file1.canWrite()); // true System.out.println("设置文件file1和目录dir1是否可读可写"); file1.setReadable(false); //在windows系统中,认为所有文件都是可读的,所以设置无效 System.out.println(file1.canRead()); // true file1.setWritable(false); //在windows系统中,可以设置文件是否可写 System.out.println(file1.canWrite()); // false dir1.setWritable(false); System.out.println(dir1.canWrite()); // true System.out.println("查看目录是否可隐藏"); System.out.println(dir1.isHidden()); //false } }
-
5. File类的获取功能
-
获取功能
-
public String getAbsolutePath():获取绝对路径
-
public String getPath():获取路径
-
public String getName():获取名称
-
public long length():获取长度。字节数
-
public long lastModified():获取最后一次的修改时间,毫秒值
-
public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
-
public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
-
-
案例演示
-
File类的获取功能
-
package com.heima.file; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo5_File { /** public String getAbsolutePath():获取绝对路径 public String getPath():获取路径 public String getName():获取名称 public long length():获取长度。字节数 public long lastModified():获取最后一次的修改时间,毫秒值 public String[] list():获取指定目录下的所有文件或者文件夹的名称数组 public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组 * @throws IOException */ public static void main(String[] args) throws IOException { File file1 = new File("a/b/c/test"); file1.mkdirs(); for (int i = 0; i < 10; i++) { File file_i = new File("a/b/c/test/" + i); file_i.createNewFile(); } System.out.println("获取绝对路径:" + file1.getAbsolutePath()); // 获取绝对路径:D:JAVAcoursesday19ac est System.out.println("获取路径:" + file1.getPath()); // 获取路径:ac est System.out.println("获取名称:" + file1.getName()); // 获取名称:test System.out.println("获取长度,字节数:" + file1.length()); //获取长度,字节数:4096 System.out.println("获取最后一次的修改时间,毫秒值:" + file1.lastModified()); // 获取最后一次的修改时间,毫秒值:1592288698496 Date d = new Date(file1.lastModified()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:MM:SS"); System.out.println(sdf.format(d)); // 2020-24-16 14:06:496 System.out.println("获取指定目录下的所有文件或者文件夹的名称数组:"); String[] arr_s = file1.list(); for (String s : arr_s) { System.out.println(s); // 0 1 2 3 .. 9 } System.out.println("获取指定目录下的所有文件或者文件夹的File数组:"); File[] listFiles = file1.listFiles(); for (File file : listFiles) { System.out.println(file); } /* ac est ac est1 ac est2 ac est3 ac est4 ac est5 ac est6 ac est7 ac est8 ac est9 */ } }
-
6. 输出指定目录下指定后缀的文件名
-
案例演示
-
需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
-
package com.heima.file; import java.io.File; public class Demo6_File { /** 需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称 */ public static void main(String[] args) { // demo1(); File dir = new File("E:\"); File[] subfiles = dir.listFiles(); // 获取E盘下所有的文件或文件夹对象 for (File file : subfiles) { if(file.isFile() && file.getName().endsWith(".jpg")) { System.out.println(file); } } } public static void demo1() { File dir = new File("E:\"); String[] arr = dir.list(); // 获取E盘下的所有文件和文件夹 for (String string : arr) { if(string.endsWith(".jpg")) { System.out.println(string); } } } }
-
7. 文件名称过滤器的概述及使用
-
文件名称过滤器的概述
-
public String[] list(FilenameFilter filter)
-
public File[] listFiles(FileFilter filter)
-
-
文件名称过滤器的使用
-
需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
-
package com.heima.file; import java.io.File; import java.io.FilenameFilter; public class Demo6_File { /** 需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称 */ public static void main(String[] args) { File dir = new File("E:\"); String[] arr = dir.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { File file = new File(dir,name); return file.isFile() && file.getName().endsWith(".jpg"); } }); for (String string : arr) { System.out.println(string); } } }
-
-
源码分析
-
带文件名称过滤器的list()方法的源码
-
public String[] list(FilenameFilter filter) { String names[] = list(); // 获取文件名称数组 if ((names == null) || (filter == null)) { return names; // 判断null值情况 } List<String> v = new ArrayList<>(); // 生成ArrayList数组列表,用于存储符合文件过滤器条件的文件名名称 for (int i = 0 ; i < names.length ; i++) { if (filter.accept(this, names[i])) { // 调用文件过滤器的accept的方法 v.add(names[i]); } } return v.toArray(new String[v.size()]); // 将输出结果转换为数组 }
-
8. File类(递归)
递归,就是方法自己调用自己。
-
5的阶乘
-
-
package com.heima.test; public class Test4 { /** 5的阶乘 1 * 2 * 3 * 4 * 5 分析: 5! = 5 * (4!) = 5 * 4 * (3!) = 5 * 4 * 3 * (2!) = 5 * 4 * 3 * 2 * (1!) */ public static void main(String[] args) { int res = fun(5); System.out.println(res); } public static int fun(int num) { if(num == 1) { return num; } else { return num * fun(num - 1); } } }
- 所有方法都在栈内,直到fun(1)执行完,开始逐步弹栈。
- 递归的缺点:如果调用的次数过多,容易出现栈内存溢出
- 递归的优点:不用知道循环的次数
- 问题:构造方法是否可以递归调用?
- 不能
- 问题:递归调用是否必须有返回值?
- 不一定,可以有,也可以没有
- 如:一个给定文件夹路径下的所有的.java文件名
-
-
需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
-
package com.heima.test; import java.io.File; import java.util.Scanner; public class Test5 { /** 需求: 从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名 */ public static void main(String[] args) { // 1. 创建键盘录入对象,对路径进行判断,是否为文件夹,文件,是否存在 File dir = getDir(); // 2. 获取所有该文件夹下的所有.java的文件名 // 获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中 // 遍历数组,对每一个文件或文件夹做判断 // 如果是文件,并且后缀是".java"的就打印输出; // 如果是文件夹,就递归调用。 printJavaFile(dir); } public static File getDir() { Scanner sc = new Scanner(System.in); System.out.println("请输入目标文件夹:"); while(true) { String line = sc.nextLine(); File dir = new File(line); if(!dir.exists()) { System.out.println("您录入的文件夹路径不存在,请重新录入:"); } else if(dir.isFile()) { System.out.println("您录入的是文件路径,请重新录入文件夹路径:"); } else { return dir; } } } public static void printJavaFile(File dir) { // 获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中 File[] subFiles = dir.listFiles(); for (File subFile : subFiles) { if(subFile.isFile() && subFile.getName().endsWith(".java")){ System.out.println(subFile); } else if (subFile.isDirectory()){ printJavaFile(subFile); } } } }
-