【友情链接】➡➡▶IO流 之 File类 & 递归
【友情链接】➡➡▶IO流 之 过滤器 & 字节流
【友情链接】➡➡▶IO流 之字符流 & 属性集(Properties集合)
【友情链接】➡➡▶IO流 之 缓冲流 & 转换流
【友情链接】➡➡▶IO流 之 序列化流 & 打印流
一、了解File类
(1)File概述
java.io包下的 File类是对文件和目录路径名的抽象表示,File类主要用于对文件和目录的创建、查找和删除等操作。
- 文件和目录可以通过File封装成对象
- File封装的并不是一个具体的文件,只是文件的路径,而这个路径可以存在或不存在,然后可以通过具体的操作把这个路径转化为具体的存在。
注意:File类是一个与系统无关的类,任何的操作系统都可以使用这个类以及类中的方法。
//使用File类常见的单词
file : 文件
directory : 目录(文件夹)
path : 路径
(2)File类的静态成员变量
/*File类常见的成员变量
*
* 1.与系统有关的路径分隔符:
* static String pathSeparator :为方便,表示为一个字符串。
* static char pathSeparatorChar :表示为字符
*
* 2.与系统有关的默认名称分隔符:
* static String separator :为方便,表示为一个字符串。
* static char separatorChar :表示为字符
* */
//与系统有关的路径分隔符:Windows下是分号‘ ; ’ Linux下是冒号‘ : ’
String pathSeparator = File.pathSeparator;
System.out.println("pathSeparator:\t"+pathSeparator);
char pathSeparatorChar = File.pathSeparatorChar;
System.out.println("pathSeparatorChar:\t"+pathSeparatorChar);
//与系统有关的默认名称分隔符:Windows下是反斜杠'\ ' Linux下是正斜杠 '/ '
String separator = File.separator;
System.out.println("separator:\t"+separator);
char separatorChar = File.separatorChar;
System.out.println("separatorChar:\t"+separatorChar);
看下打印结果:
1.与系统有关的路径分隔符:
Windows下是分号‘ ; ’ Linux下是冒号‘ : ’
2.与系统有关的默认名称分隔符:
Windows下是反斜杠'\ ' Linux下是正斜杠 '/ '
Windows下目录为: C:\a\b.txt
Linux下目录为: C:/a/b.txt
我们在开发时,写的程序是要兼容多系统的,不仅仅要在Windows上执行还要能在Linux、Unix等操作系统中执行,所以路径就不能写死了,那么,我们就可以采用字符串拼接来解决这种问题
"C:"+File.separator+"a"+File.separator+"b.txt"
(3) 绝对路径和相对路径
-
绝对路径:一个完整的路径,以盘符(c 、D、F、e等)开始的路径,例如
c:\\abc.txt
或C:\\test\a\1.txt
-
相对路径:一个简化的路径,
相对:指相对于当前项目的根目录(C:\ \ test \ a),那么,路径就可以简化了,C:\\test\a\1123.txt
–>简化为1123.tx
这样就省略了项目的根目录
注意:
- 1.路径不区分大小写
- 2.路径中的文件名称分隔符,在Windows下使用的反斜杠,而一个反斜杠表示的是转义字将,两个反斜扛才表示一个普通的反斜扛
(4)File类的构造方法
第一种:
FiLe(String pathname)
将给定路径名字符串 转换为 抽象路径名 来创建一个新FiLe实例。
注意:
- 路径既能以文件结尾,也能以文件夹结尾
- 路径既可以为相对路径,也可以为绝对路径
- 路经可以是真实存在的,也可以是不存在的
- 创建的FiLe对象只是把字符串路径封装为FiLe对象,而并不考虑路径是否真是存在
//创建一个file对象
File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\sj\\javabase\\file");
System.out.println(file);
//打印结果 D:\BigData\java\javalearn\src\com\sj\javabase\file --->目录
//new的是一个对象,但打印出来的是一个路径,说明了File类重写了toString方法
File file1 = new File("D:\\BigData\\java\\javalearn\\src\\com+\\sj\\javabase\\abc.txt");
System.out.println(file1);
//D:\BigData\java\javalearn\src\com\sj\javabase\abc.txt --->文件
//相对路径
File file2 = new File("123.txt");
System.out.println(file2);
第二种:
File(String parent, String child)
从 父路径名字符串 和 子路径名字符串 创建新的 File实例。
优点:
父路径和子路径,分开了可以单独书写,
使用起来会很灵活,父路径和子路经都可以改变
File file3 = new File("D:\\BigData\\java\\javalearn\\src\\com\\sj\\javabase\\file", "abc.txt");
System.out.println(file3);
第三种:
File(File parent, String child)
从父抽象路径名 和 子路径名字符串 创建新的 File实例。
优点:
1.父路径和子路径,分开了可以单独书写,
使用起来会很灵活,父路径和子路经都可以改变
2.父路径是File类型,可以使用FiLe类的方法对路径进行一些操作,
然后可以再使用路径来创建对象.
(5)File常用方法
(一)、获取功能以及遍历功能的方法
获取功能:
public String getAbsolutePath(): 返回此File的绝对路径名字符串。
public String getPath(): 将此File转换为路径名字符串。
public string getName(): 返回由此File表示的文件或目录的名称。
遍历功能:
public String[] list(): 返回File表示的目录下的目录和文件的名称
public File[] listFile(): 返回File表示的目录下的目录和文件的对象
public long length() : 返回由此File表示的文件的长度。
(以字节为单位,注意文件夹是没有大小的,
如果构造方法中给的路径名不存在,那么返回值为0)
下面我们来详细的看一下各个方法的使用:
已有目录结构:
//1.public String getAbsolutePath(): 返回此File的绝对路径名字符串。
//绝对路径file
File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\abc.txt");
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);
//返回file的构造方法中的D:\BigData\java\javalearn\src\com\xiaobei\iostream\file\abc.txt
//相对路径file1---————>相对的路径为 D:\BigData\java\javalearn
File file1 = new File("abc.txt");
String absolutePath1 = file1.getAbsolutePath();
System.out.println(absolutePath1);
//返回file1的构造方法中的绝对路径 D:\BigData\java\javalearn\abc.txt
System.out.println("-------------------------");
//2.public String getPath(): 将此File转换为路径名字符串,返回的为构造方法中的路径
String path = file.getPath();
System.out.println(path);
//返回file的构造方法中的路径名D:\BigData\java\javalearn\src\com\xiaobei\iostream\file\abc.txt
String path1 = file1.getPath();
System.out.println(path1);//返回file1的构造方法中的路径名abc.txt
System.out.println("--------------------------");
//3.public string getName(): 返回由此File表示的文件或目录的名称。
File file2 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file01");
String name = file.getName();
System.out.println(name);//返回file的文件名abc.txt
String name1 = file2.getName();
System.out.println(name1);//返回file2的文件夹名file01
System.out.println("--------------------------");
//4.public long length() : 返回由此File表示的文件的长度。
//文件存在
long length = file.length();
System.out.println(length);//file路径的文件abc.txt中文件长度 返回 96
//文件不存在
long length1 = file2.length();
System.out.println(length1);//file2构造方法中路径为目录 返回 0
//文件夹的遍历功能
System.out.println("--------------------------");
//5.public String[] list(): 返回File表示的目录下的目录和文件的名称
File file3 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file");
String[] list = file3.list();
for (String s : list) {
System.out.println(s);
}
System.out.println("--------------------------");
//6.public File[] listFile(): 返回File表示的目录下的目录和文件的对象
File[] files = file3.listFiles();
for (File file4 : files) {
System.out.println(file4);
}
(二)、判断功能的方法
1.public boolean isDirectory() 判断file是否为目录
2.public boolean isFile() 判断file是否为文件
3.public boolean exists() 判断file是否存在
注意:
1.方法1和2有个使用前提
就是当前要判断的路径需要是真实存在的,否则都返回false
2.方法1和方法2是互斥的
下面我们来详细的看一下各个方法的使用:
//1.public boolean exists() 判断file是否存在
File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\abc.txt");
boolean exists = file.exists();
System.out.println(exists);//true
File file1 = new File("D:\\BigData\\java\\javalearn\\abc.txt");
boolean exists1 = file1.exists();
System.out.println(exists1);//false
System.out.println("-------------------------");
//2.public boolean isDirectory() 判断file是否为目录
boolean directory = file.isDirectory();
System.out.println(directory);//false
File file2 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file");
boolean directory1 = file2.isDirectory();
System.out.println(directory1);//true
System.out.println("-------------------------");
//3.public boolean isFile() 判断file是否为文件
boolean file3 = file.isFile();
System.out.println(file3);//true
boolean file4 = file2.isFile();
System.out.println(file4);//false
(三)、创建功能的方法
1.public boolean createNewFile()
当且仅当具有该名称的文件尚不存在时
创建一个由该file路径名命名的新的空文件。
方法的返回值:布尔值
true: 文件不存在,创建文件,返回true
false: 文件存在,不会创建,返回foLse
注意事项;
1.该方法只能创建文件不能创建文件夹
2.创建文件的路径必须存在,不然就会抛出异常
3.createNewFile声明抛出了IOException ,
调用这个方法,必须的处理异常,要么throws ,要么try catch
2.public boolean mkdir()
创建由此file路径名命名的目录,只能创建单级文件夹
3.public boolean mkdirs()
创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
可以创建多级文件夹
下面来看一下详细代码;
创建目录前:
public static void main(String[] args) throws IOException {
//1.public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\a.txt");
boolean newFile = file.createNewFile();
System.out.println(newFile);//true
//要创建的文件已存在
File file1 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\abc.txt");
boolean newFile1 = file1.createNewFile();
System.out.println(newFile1);//false
System.out.println("------------------------");
//2.public boolean mkdir():创建由此FiLe表示的目录。
File file2 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file03");
boolean mkdir = file2.mkdir();
System.out.println(mkdir);//true
File file3 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file01");
boolean mkdir1 = file3.mkdir();
System.out.println(mkdir1);//false
System.out.println("------------------------");
//3.public boolean mkdirs():创建由此FiLe表示的目录,包括任何必需但不存在的父目录。
File file4 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file04\\file05");
boolean mkdirs = file4.mkdirs();
System.out.println(mkdirs);//true
}
(四)、删除功能的方法
public boolean delete()删除抽象路径表示的文件或目录
注意:
删除目录时,如果目录下有内容,那么就不能直接删除,
而需要先删除目录中的内容后再删除目录
//4.public boolean delete() :删除由此FLe表示的文件或目录。
File file5 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file02");
boolean delete = file5.delete();
System.out.println(delete);//true
二、了解递归
(一)、概念
递归就是指在方法中调用方法本身,也就是说当要实现的某个功能的思想逻辑是重复的,也就是每一层的代码是类似的,那么就可采用递归来实现,只需要少量的程序就可以搞定解决问题过程中的多次重复计算,可以节约大量的代码量。
(二)、递归的分类
递归分为两种,直接递归和间接递归。
- 直接递归指:方法自身调用自己。
public void function1(){
function1();
}
- 间接递归指:方法1调用方法2,方法2调用方法3,方法3调用方法1。
public void function1(){
function2();
}
public void function2(){
function3();
}
public void function3(){
function1();
}
注意:
- 递归一定要有条件限定用来保证递归能够停止执行,否则会导致栈内存溢出。
- 在递归中即使有限定的条件但递归次数还是不能太多。否则同样会导致栈内存溢出。
- 构造方法不能递归调用,构造方法是用来创建对象用的,若递归调用,那么堆中就会一直new对象,最终导致堆内存溢出。
- 当使用递归方法的时候,方法的主体不变,每次调用方法的参数不同。
(三)、递归案例
1.使用递归计算求和
public static void main(String[] args) {
int sum = sum(100);
System.out.println(sum);
}
public static int sum(int n){
if(n==0)
return 0;
return n+sum(n-1);
}
2.使用递归计算正整数的阶乘
public static void main(String[] args) {
int jc = JC(8);
System.out.println(jc);
}
public static int JC(int n){
if(n==1)
return 1;
return n*JC(n-1);
}
3.使用递归来遍历目录下的所有文件的路径
public static void main(String[] args) {
File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file");
printFiles(file);
}
public static void printFiles(File file){
//返回File表示的目录下的目录和文件的对象到File的对象数组中
File[] files = file.listFiles();
//进入循环
for (File file1 : files) {
if(file1.isFile()){
//判断file是不是文件,是打印,不是进入递归
System.out.println(file1.getAbsolutePath());
}else {
printFiles(file1);//递归调用本身
}
/*反向逻辑
if (file1.isDirectory()){
printFiles(file1);;
}else {
System.out.println(file1.getAbsolutePath());
}
*/
}
}
制作不易,各位友友们,大佬们给点鼓励!
点赞👍 收藏+关注 一键三连走起!