@学习记录
开始学习Java
遵从同学的指导,从Java se开始学习
黑马的JavaSE零基础入门【File类、递归】
第一章 File类
1.1 概述
19-03 File类的概述和静态成员变量
package day_08FileAndRecursion.demo01File;
import java.io.File;
/*
java.io.File类
文件和目录路径名的抽象表示形式
java把电脑中的文件和文件夹(目录)封装为了一个File类,可以使用File类对文件和文件夹进行操作
创建文件/文件夹
删除文件/文件夹
获取文件/文件夹
判断文件/文件夹是否存在
对文件夹进行遍历
获取文件的大小
File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
file:文件
directory:文件夹
path:路径
static String pathSeparator 与系统有关的路径分隔符,为了方便,他被表示为了一个字符串
static char pathSeparator 与系统有关的路径分隔符
static String separator 与系统有关的默认名称分隔符,为了方便,他被表示为了一个字符串
static char separator 与系统有关的默认名称分隔符
操作路径不能写死
D:\ruanjian\MATLAB windows
D:/ruanjian/MATLAB Linux
"D:"+File.separator+"ruanjian"+File.separator+"MATLAB"
*/
public class Demo01File {
public static void main(String[] args) {
String pathSeparator = File.pathSeparator;
System.out.println(pathSeparator); // 路径分隔符,windows ; Linux :
String separator = File.separator;
System.out.println(separator); // 默认名称分隔符,windows \ Linux /
}
}
19-04 绝对路径和相对路径
/*
路径:
绝对路径:是一个完整的路径,以盘符开始的路径
相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录而言
注意:路径不区分大小写,路径中的文件名称分隔符windows使用反斜杠,两个反斜杠代表一个普通的反斜杠
*/
1.2 构造方法
19-05 File类的构造方法
package day_08FileAndRecursion.demo01File;
import java.io.File;
/*
路径:
绝对路径:是一个完整的路径,以盘符开始的路径
相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录而言
注意:路径不区分大小写,路径中的文件名称分隔符windows使用反斜杠,两个反斜杠代表一个普通的反斜杠
File类的构造方法
*/
public class Demo02File {
public static void main(String[] args) {
show01();
show02();
show03();
}
/*
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建新的实例
pathname可以以文件结尾,也可以是文件夹结尾
pathname可以是相对路径,也可以是绝对路径
pathname可以是存在,也可以是不存在
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况
*/
private static void show01() {
File file = new File("a.txt");
System.out.println(file);
}
/*
File(String parent, String child) 根据parent路径名字符串和chile路径名字符串创建一个新的File实例
把路径分成了两个部分,好处是:父路径和子路径可以单独书写,使用灵活,都可以变化
*/
private static void show02() {
File file = new File("c:\\", "a.txt");
System.out.println(file);
}
/*
File(File parent, String child) 根据parent路径名字符串和chile路径名字符串创建一个新的File实例
把路径分成了两个部分,好处是:父路径和子路径可以单独书写,使用灵活,都可以变化;父路径是File类型,可以使用File的方法对路径进行一些操作
*/
private static void show03() {
File parent = new File("d:\\");
File file = new File(parent, "b.xls");
System.out.println(file);
}
}
1.3 常用方法
获取功能的方法
绝对路径和相对路径
19-06 File类获取功能的方法
package day_08FileAndRecursion.demo01File;
import java.io.File;
/*
File类获取功能的方法
public String getAbsolutePath() 返回此File的绝对路径名字符串
public String getPath() 将此File转换为路径名字符串
public String getName() 返回由此File表示的文件或目录的名称
public long length() 返回由此File表示的文件的长度
*/
public class Demo03File {
public static void main(String[] args) {
show01();
System.out.println("===============");
show02();
System.out.println("===============");
show03();
System.out.println("===============");
show04();
}
private static void show01() {
File file1 = new File("b.xls");
File file2 = new File("D:\\IDEA\\test-java\\b.xls");
System.out.println(file1.getAbsolutePath());
System.out.println(file2.getAbsolutePath());
}
// 获取的是构造方法中传递的路径
// toString就是调用的getPath方法
private static void show02() {
File file1 = new File("b.xls");
File file2 = new File("D:\\IDEA\\test-java\\b.xls");
System.out.println(file1.getPath());
System.out.println(file2.getPath());
}
// 获取的是构造方法中传递的路径的结尾部分(文件/文件夹)
private static void show03() {
File file1 = new File("b.xls");
File file2 = new File("D:\\IDEA\\test-java");
System.out.println(file1.getName());
System.out.println(file2.getName());
}
// 获取的是构造方法指定的文件的大小,以字节为单位
// 注意:文件夹是没有大小概念的,不能获取文件夹的大小;
// 如果构造方法中给出的路径不存在,那么length方法返回0
private static void show04() {
File file1 = new File("b.xls");
File file2 = new File("D:\\IDEA\\test-java");
System.out.println(file1.length());
System.out.println(file2.length()); // 文件夹返回是0
}
}
判断功能的方法
19-07 File类判断功能的方法
package day_08FileAndRecursion.demo01File;
import java.io.File;
/*
File判断功能的方法
public boolean exists() 此File表示的文件或目录是否实际存在
public boolean isDirectory() 此File表示的是否为目录
public boolean isFile() 此File表示的是否为文件
*/
public class Demo04File {
public static void main(String[] args) {
show01();
System.out.println("================");
show02();
}
private static void show01() {
File file1 = new File("a.txt");
File file2 = new File("D:\\IDEA\\test-java");
System.out.println(file1.exists());
System.out.println(file2.exists());
}
// 两个方法是互斥的,他们的使用前提:路径必须是存在的,否则都返回false
// 因此需要先判断文件/文件夹是否存在
private static void show02() {
File file1 = new File("b.txt");
File file2 = new File("test-java.iml");
File file3 = new File("D:\\IDEA\\test-java");
if(file1.exists()) {
System.out.println(file1.isDirectory());
System.out.println(file1.isFile());
}
if(file2.exists()) {
System.out.println(file2.isDirectory());
System.out.println(file2.isFile());
}
if(file3.exists()) {
System.out.println(file3.isDirectory());
System.out.println(file3.isFile());
}
}
}
创建删除功能的方法
19-08 File类创建删除功能的方法
package day_08FileAndRecursion.demo01File;
import java.io.File;
import java.io.IOException;
/*
File类创建删除功能的方法
public boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件
public boolean delete() 删除由此File表示的文件或目录
public boolean mkdir() 创建由此File表示的目录
public boolean mkdirs() 创建由此File表示的目录,包括任何必需但不存在的父目录
*/
public class Demo05File {
public static void main(String[] args) throws IOException {
show01();
System.out.println("===============");
show02();
System.out.println("===============");
show03();
}
/*
注意:
1.此方法只能创建文件,不能创建文件夹
2.创建文件的路径必须存在,否则会抛出异常
*/
private static void show01() throws IOException {
File file = new File("D:\\IDEA\\test-java\\a.txt");
boolean newFile = file.createNewFile();
System.out.println(newFile);
}
// 创建文件的路径必须存在,否则会返回false
private static void show02() {
File file1 = new File("D:\\IDEA\\test-java\\java1");
File file2 = new File("D:\\IDEA\\test-java\\java2\\33");
boolean mkdir = file1.mkdir();
boolean mkdirs = file2.mkdirs();
System.out.println(mkdir);
System.out.println(mkdirs);
}
// 文件夹中有内容,不会删除返回false;构造方法中路径不存在false
// 注意:该方法直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎
private static void show03() {
File file1 = new File("D:\\IDEA\\test-java\\java1");
File file2 = new File("D:\\IDEA\\test-java\\java3");
boolean delete1 = file1.delete();
boolean delete2 = file2.delete();
System.out.println(delete1);
System.out.println(delete2); // 路径不存在
}
}
1.4 目录的遍历
19-09 File类遍历(文件夹)目录功能
package day_08FileAndRecursion.demo01File;
import java.io.File;
/*
File类遍历(文件夹)目录功能
public String[] list() 返回一个String数组,表示该File目录中的所有子文件或目录
public File[] listFiles() 返回一个File数组,表示该File目录中的所有子文件或目录
注意:
list方法和listFiles方法遍历的是构造方法中给出的目录
如果构造方法中给出的目录的路径不存在,会抛出空指针异常
如果构造方法中给出的路径不是一个目录,也会抛出空指针异常
*/
public class Demo06File {
public static void main(String[] args) {
show01();
System.out.println("==============");
show02();
}
private static void show01() {
File file1 = new File("D:\\IDEA\\test-java");
String[] list = file1.list();
for (String s : list) {
System.out.println(s);
}
}
private static void show02() {
File file1 = new File("D:\\IDEA\\test-java");
File[] files = file1.listFiles();
for (File file : files) {
System.out.println(file);
}
}
}
第二章 递归
2.1 概述
19-10 递归概念和分类和注意事项
package day_08FileAndRecursion.demo02Recursion;
/*
递归:方法自己调用自己
递归的分类:
直接递归:方法自身调用自己
间接递归:A方法调用B方法,B方法调用C方法,C方法调用A方法
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
构造方法禁止递归
递归的使用前提:
当调用方法时,方法的主体不变,每次调用方法的参数不同,可以使用递归
*/
public class Demo01Recursion {
public static void main(String[] args) {
a();
}
private static void a() {
System.out.println("a方法");
a();
}
}
2.2 递归累加求和
计算1~n的和
代码执行图解
19-11 练习:使用递归计算1~n之间的和
package day_08FileAndRecursion.demo02Recursion;
import static day_03.demo04.Demo01VarArgs.add;
/*
练习:使用递归计算1~n之间的和
已知:最大值n,最小值1
递归停止条件:n = 1
递归的目的:获取下一个被加的数字
*/
public class Demo02Recursion {
public static void main(String[] args) {
System.out.println(sum(3));;
}
private static int sum(int i) {
if(i == 1){
return 1; // n=1时无法形成递归,直接返回结果
} else {
return i + sum(i-1);
}
}
}
2.3 递归求阶乘
19-12 练习:使用递归计算阶乘
package day_08FileAndRecursion.demo02Recursion;
/*
练习:使用递归计算1~n之间的乘积
已知:最大值n,最小值1
递归停止条件:n = 1
递归的目的:获取下一个被乘的数字
*/
public class Demo03Recursion {
public static void main(String[] args) {
System.out.println(multi(4));;
}
private static int multi(int i) {
if(i == 1){
return 1; // n=1时无法形成递归,直接返回结果
} else {
return i * multi(i-1);
}
}
}
2.4 递归打印多级目录
19-13 练习:递归打印多级目录
package day_08FileAndRecursion.demo02Recursion;
import java.io.File;
/*
练习:递归打印多级目录
*/
public class Demo04Recursion {
public static void main(String[] args) {
File file = new File("D:\\面试");
printFile(file);
}
// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
public static void printFile(File dir){
System.out.println(dir);
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
System.out.println(file);
} else {
printFile(file);
}
}
}
}
第三章 综合案例
3.1 文件搜索
19-14 练习:综合案例文件搜索
package day_08FileAndRecursion.demo02Recursion;
import java.io.File;
/*
练习:文件搜索
搜索D:\aaa目录中的.java文件
先遍历文件目录,找到所有文件
再判断是否为.java文件
*/
public class Demo05Recursion {
public static void main(String[] args) {
File file = new File("D:\\IDEA\\test-java");
printFile(file);
}
// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
public static void printFile(File dir){
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
// 判断是否为.java文件
// 利用String的endsWith进行判断
// 可以利用getName,getPath,toString方法
// toLowerCase()把大写字母转换为小写字母
if (file.toString().toLowerCase().endsWith(".java")) {
System.out.println(file);
}
} else {
printFile(file);
}
}
}
}
3.2 文件过滤器优化
19-15 练习:FileFilter文件过滤器的原理和使用
package day_08FileAndRecursion.demo03Filter;
import java.io.File;
import java.io.FileFilter;
/*
使用过滤器实现文件的查找
在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器
File[] listFilter(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名的过滤器
作用:用来过滤文件
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中
File[] listFilesFilter(FilenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实现可用于过滤器文件名
作用:用来过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中
注意:两个过滤器接口是没有实现类的,需要自己写实现类,重写过滤的方法accept,在方法中自定义过滤的规则
*/
public class Demo01Filter {
public static void main(String[] args) {
File file = new File("D:\\IDEA\\test-java");
printFile(file);
}
/*// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
public static void printFile(File dir) {
File[] files = dir.listFiles(new FileFilterImpl()); // 传递过滤器对象
for (File file : files) {
System.out.println(file);
if (file.isFile()) {
// 判断是否为.java文件
System.out.println(file);
} else {
printFile(file);
}
}
}*/
/*// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
// 匿名内部类
public static void printFile(File dir) {
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getPath().toLowerCase().endsWith(".java");
}
}); // 传递过滤器对象
for (File file : files) {
System.out.println(file);
if (file.isFile()) {
// 判断是否为.java文件
System.out.println(file);
} else {
printFile(file);
}
}
}*/
// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
// lambda优化
public static void printFile(File dir) {
File[] files = dir.listFiles( pathname -> pathname.isDirectory() || pathname.getPath().toLowerCase().endsWith(".java")); // 传递过滤器对象
for (File file : files) {
System.out.println(file);
if (file.isFile()) {
// 判断是否为.java文件
System.out.println(file);
} else {
printFile(file);
}
}
}
}
package day_08FileAndRecursion.demo03Filter;
import java.io.File;
import java.io.FileFilter;
// 创建过滤器的实现类
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
// 如果pathname是一个文件加,也返回true,继续遍历这个文件夹
if (pathname.isDirectory()) {
return true;
}
return pathname.toString().toLowerCase().endsWith(".java");
}
}
19-16 练习:FilenameFilter文件过滤器的原理和使用
package day_08FileAndRecursion.demo03Filter;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
/*
使用过滤器实现文件的查找
在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器
File[] listFilter(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名的过滤器
作用:用来过滤文件
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中
File[] listFilesFilter(FilenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实现可用于过滤器文件名
作用:用来过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中
注意:两个过滤器接口是没有实现类的,需要自己写实现类,重写过滤的方法accept,在方法中自定义过滤的规则
*/
public class Demo02Filter {
public static void main(String[] args) {
File file = new File("D:\\IDEA\\test-java");
printFile(file);
}
/*// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
// 匿名内部类
public static void printFile(File dir) {
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
}
}); // 传递过滤器对象
for (File file : files) {
System.out.println(file);
if (file.isFile()) {
// 判断是否为.java文件
System.out.println(file);
} else {
printFile(file);
}
}
}*/
// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
// lambda优化
public static void printFile(File dir) {
File[] files = dir.listFiles((dire, name) -> new File(dire,name).isDirectory() || name.toLowerCase().endsWith(".java")); // 传递过滤器对象
for (File file : files) {
System.out.println(file);
if (file.isFile()) {
// 判断是否为.java文件
System.out.println(file);
} else {
printFile(file);
}
}
}
}