JavaSE-File类、递归
2019-12-09 本文已影响0人
雷哒哒
目录
[TOC]
第一章:File类
1.1 File类介绍
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
1.2 构造方法
-
语法
-
public File(String pathname)
:通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 -
public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。 -
public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。
-
-
代码
// 创建File对象-方式1 File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1); // 创建File对象-方式2 File file2 = new File("D:\\JavaCode\\BasicCode\\a","1.txt"); System.out.println(file2); // 创建File对象-方式3 File file3 = new File(file1,"1.txt"); System.out.println(file3);
-
注意事项
- 一个File对象代表硬盘中实际存在的一个文件或者目录。
- 无论该路径下是否存在文件或者目录,都不影响File对象的创建
1.3 File类静态成员
-
静态成员
-
public static final String pathSeparator
- 与系统有关的路径分隔符。
-
public static final String separator
- 获取与系统有关的默认名称分隔符。
-
-
代码
System.out.println(File.pathSeparator); // ";" System.out.println(File.separator); // "/" // 注意:不同的操作系统获取的分隔符是不一样的
1.4 常用方法
-
获取功能-相关方法
-
方法
-
public String getAbsolutePath()
:返回此File的绝对路径名字符串。 -
public String getPath()
:将此File转换为路径名字符串。 -
public String getName()
:返回由此File表示的文件或目录的名称。 -
public long length()
:返回由此File表示的文件的长度。
-
-
代码
public static void main(String[] args) { // 1. `public String getAbsolutePath() `:返回此File的绝对路径名字符串。 show1(); // 2. `public String getPath()` :将此File转换为路径名字符串。 show2(); // 3. `public String getName() `:返回由此File表示的文件或目录的名称。 show3(); // 4. `public long length() `:返回由此File表示的文件的长度(文件的大小) show4(); } private static void show4() { // 不存在的文件夹或不存在的文件或存在的文件夹返回的都是0 File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1.length()); // 0 File file3 = new File("D:\\JavaCode\\BasicCode\\aa"); System.out.println(file3.length()); //0 File file2 = new File("D:\\JavaCode\\BasicCode\\a\\logo01.png"); System.out.println(file2.length()); //11610 字节 } private static void show3() { File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1.getName()); // a File file2 = new File("1.txt"); // 1.txt System.out.println(file2.getName()); } private static void show2() { // 文件路径是什么就返回什么 File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt"); System.out.println(file1.getPath()); // D:\JavaCode\BasicCode\1.txt File file2 = new File("1.txt"); // 1.txt System.out.println(file2.getPath()); } private static void show1() { File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt"); System.out.println(file1.getAbsoluteFile()); // D:\JavaCode\BasicCode\1.txt File file2 = new File("1.txt"); // D:\JavaCode\BasicCode\1.txt System.out.println(file2.getAbsoluteFile()); }
-
-
绝对路径和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
-
判断功能-相关方法
-
方法
-
public boolean exists()
:此File表示的文件或目录是否实际存在。 -
public boolean isDirectory()
:此File表示的是否为目录(目录实际存在)。 -
public boolean isFile()
:此File表示的是否为文件(文件实际存在)。
-
-
代码
File file1 = new File("a"); // 1. `public boolean exists()` :此File表示的文件或目录是否实际存在。 System.out.println(file1.exists()); // true // 2. `public boolean isDirectory()` :此File表示的是否为目录。 System.out.println(file1.isDirectory()); // true // 3. `public boolean isFile()` :此File表示的是否为文件。 System.out.println(file1.isFile()); // false
-
-
创建删除功能-相关方法
-
方法
-
public boolean createNewFile()
:当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 -
public boolean delete()
:删除由此File表示的文件或目录。 -
public boolean mkdir()
:创建由此File表示的目录。 -
public boolean mkdirs()
:创建由此File表示的目录,包括任何必需但不存在的父目录。
-
-
代码
public static void main(String[] args) throws IOException { // 1. `public boolean createNewFile()` :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 File file1 = new File("a"); // 已经存在的文件目录 System.out.println(file1.createNewFile()); // false File file2 = new File("b"); // 不存在的文件 System.out.println(file2.createNewFile()); // true // 2. `public boolean delete() `:删除由此File表示的文件或目录。 File file3 = new File("c"); // 不存在的文件 System.out.println(file3.delete()); // false File file4 = new File("b"); // 不存在的文件 System.out.println(file4.delete()); // true // 3. `public boolean mkdir()` :创建由此File表示的目录。 File file5 = new File("e"); // 不存在的文件目录 System.out.println(file5.mkdir()); // true File file6 = new File("e//g/f"); // 多级文件目录 System.out.println(file6.mkdir()); // false // 4. `public boolean mkdirs() `:创建由此File表示的目录,包括任何必需但不存在的父目录。 System.out.println(file6.mkdirs()); // true }
-
1.5 目录的遍历
-
方法
-
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。 -
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
-
-
代码
// 1. `public String[] list()` :返回一个String数组,表示该File目录中的所有子文件或目录。 File file1 = new File("D:\\JavaCode\\BasicCode"); String[]files = file1.list(); for (int i = 0; i < files.length; i++) { System.out.println(files[i]); } //2. `public File[] listFiles()` :返回一个File数组,表示该File目录中的所有的子文件或目录。 File file2 = new File("D:\\JavaCode\\BasicCode"); File[]files2 = file2.listFiles(); for (int i = 0; i < files2.length; i++) { System.out.println(files2[i]); }
-
注意事项
- 调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
第二章:递归
2.1 递归介绍
- 递归,函数自身调用自身的编程技巧。
- 递归的分类:
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
- 递归注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
2.2 递归练习1
-
需求:计算数字1 ~ n的和
-
分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。
-
代码:
// 计算数字1 ~ n的和 public static void main(String[] args) { int sum = getSum(3); System.out.println(sum); } private static int getSum(int n) { // 判断递归结束条件 if(n==1) { return 1; } // 递归任务 return n + getSum(n-1); }
-
图解:
2.3 递归练习2
-
需求:阶乘所有小于及等于该数的正整数的积。
n的阶乘:n! = n * (n‐1) *...* 3 * 2 * 1 x
-
分析:这与累和类似,只不过换成了乘法运算
- 推理得出:
n! = n * (n‐1)!
- 推理得出:
-
代码
public static void main(String[] args) { int result = factorial(3); System.out.println(result); } private static int factorial(int n) { if(n==1) { return 1; } return n * factorial(n-1); }
2.4 递归练习3
-
需求:打印多级目录及文件
-
代码:
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode\\dir"); readFile(file); } // 定义读取目录文件的方法 private static void readFile(File file) { // 获取子文件和子目录 File[]files = file.listFiles(); // 循环遍历子文件和子目录 for (File f : files) { if(f.isDirectory()){ readFile(f); }else { System.out.println(f); } } }
2.5 递归练习4
-
需求: 给一个指定的目录,递归实现过滤出该目录中所有的以及嵌套目中.java文件
-
代码:
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode"); readFile(file); } // 定义读取目录文件的方法 private static void readFile(File file) { // 获取子文件和子目录 File[]files = file.listFiles(); // 循环遍历子文件和子目录 for (File f : files) { if(f.isDirectory()){ readFile(f); }else { if(f.getName().toLowerCase().endsWith(".java")){ System.out.println(f); } } } }
2.6 文件过滤器
java.io.FileFilter
是一个接口,是File的过滤器。 该接口的对象可以传递给File类的 listFiles(FileFilter)
方法作为参数, 接口中只有一个方法。
boolean accept(File pathname)
:测试pathname是否应该包含在当前File目录中,符合则返回true。 �
-
需求:和上述练习4一样
-
分析:
-
接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
-
accept 方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回 false。保留规则:
- 要么是.java文件。
- 要么是目录,用于继续遍历。
-
通过过滤器的作用, listFiles(FileFilter) 返回的数组元素中,子文件对象都是符合条件的,可以直接打
印。
-
-
代码1:匿名内部类
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode"); readFile(file); } // 定义读取目录文件的方法 private static void readFile(File file) { // 获取子文件和子目录 File[]files = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { // 符合条件的File return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"); } }); // 循环遍历子文件和子目录 for (File f : files) { if(f.isFile()){ System.out.println(f); }else { readFile(f); } } }
-
代码2:Lambda表达式
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode"); readFile(file); } // 定义读取目录文件的方法 private static void readFile(File file) { // 获取子文件和子目录 File[]files = file.listFiles(pathname -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java")); // 循环遍历子文件和子目录 for (File f : files) { if(f.isFile()){ System.out.println(f); }else { readFile(f); } } }