Day18-2
1 File类
- 概述:可以用来操作磁盘上文件或者文件夹的类型
可以通过将文件或者文件夹的路径封装为File类对象,通过类中提供的方法操作 - 路径:
绝对路径:从根目录开始,表示一个文件或者文件夹在磁盘位置的一个字符串
相对路径:相对于某一个路径下的位置所对应的字符串
对于IDEA编辑器来说,相对路径,从项目开始
代码
public static void main(String[] args) {
//使用绝对路径来表示abc.txt所在的位置
String str = "D:\\develope\\idea\\code\\day18\\src\\demos3_file\\abc.txt";
String str2 = "D:/develope/idea//code/day18/src/demos3_file/abc.txt";
//使用相对路径来表示abc.txt所在的位置
String str3 = "day18/src/demos3_file/abc.txt";
}
1.1 构造方法
函数名 | 解释 |
---|---|
File(String pathname) | 将参数描述的字符串路径封装为一个file对象 |
File(String parent, String child) | 将两个字符串拼接之后的路径封装为一个file对象 |
File(File parent, String child) | 将第一个参数描述的file对象路径,和第二个参数字符串 拼接之后的路径再封装到一个新的对象中 |
代码
package demos3_file;
import java.io.File;
public class Demo01 {
public static void main(String[] args) {
//使用绝对路径来表示abc.txt所在的位置
String str = "D:\\develope\\idea\\code\\day18\\src\\demos3_file\\abc.txt";
String str2 = "D:/develope/idea/code/day18/src/demos3_file/abc.txt";
//使用相对路径来表示abc.txt所在的位置
String str3 = "day18/src/demos3_file/abc.txt";
//将文件abc.txt的路径封装为一个file对象
File file = new File(str);
File file2 = new File(str3);
//将文件abc.txt路径分为父级路径和子级路径来封装
File file3 = new File("day18/src","demos3_file/abc.txt");
//将父级路径对应的file对象 和子级路径对应的字符串,一起封装
File file4 = new File("day18/src/demos3_file");
File file5 = new File(file4,"abc.txt");
}
}
1.2 File类的创建方法
函数名 | 解释 |
---|---|
createNewFile() | 创建一个文件 |
mkdir() | 创建一个文件夹,如果父级路径不存在,就不能创建成功 |
mkdirs() | 创建一个文件夹,如果父级路径不存在,连着父级路径一起创建 |
代码
package demos3_file;
import java.io.File;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
//先描述要创建文件的路径
String str = "day18/src/demos3_file/abc.txt";
//将该路径封装为一个file对象
File f = new File(str);
//执行创建文件的方法
boolean boo1 = f.createNewFile();
System.out.println(boo1);
//创建一个文件夹:在demos3_file下创建一个文件夹a
//如果父级路径不存在,不能创建
File f2 = new File("day18/src/demos3_file/a");
boolean boo2 = f2.mkdir();
System.out.println(boo2);
//如果父级路径不存在,一起创建(创建多层目录)
String str3 = new String("day18/src/demos3_file/b/c");
File f3 = new File(str3);
boolean boo3 = f3.mkdirs();
System.out.println(boo3);
}
}
1.3 File类的删除功能
函数名 | 解释 |
---|---|
delete() | 删除调用者所描述的文件或者文件夹 |
注意:1、不能删除非空文件夹
2、 删除后不走回收站
代码
package demos3_file;
import java.io.File;
public class Demo03 {
public static void main(String[] args) {
//删除文件夹
File f = new File("day18/src/demos3_file/a");
boolean boo1 = f.delete();
System.out.println(boo1);
File f2 = new File("day18/src/demos3_file/b");
//不能删除非空文件夹
boolean boo2 = f2.delete();
System.out.println(boo2);
//删除文件
File f3 = new File("day18/src/demos3_file/abc.txt");
boolean boo3 = f3.delete();
System.out.println(boo3);
}
}
1.4 File类的重命名
renameTo(File dest)
注意:
1、参数不是一个字符串,而是一个改名之后的位置字符串所属的file对象
2、如果在同一个文件夹中,就是重名
3、如果在不同文件夹中,就是剪切
代码
package demos3_file;
import java.io.File;
public class Demo04 {
public static void main(String[] args) {
//该文件是改之前的
File f = new File("day18/src/demos3_file/abc.txt");
//将改之后的文件定义为一个File对象
//如果改之前和改之后的目录相同,名字不同----》重命名
// File f2 = new File("day18/src/demos3_file/a.txt");
// boolean boo1 = f2.renameTo(f);
// System.out.println(boo1);
//如果改之前和改之后的目录不同,名字相同----》剪切
// File f3 = new File("day18/src/demos3_file/a/abc.txt");
// boolean boo2 = f.renameTo(f3);
// System.out.println(boo2);
//如果改之前和改之后的名字和目录都不相同 ----》剪切+重命名
File f4 = new File("day18/src/demos3_file/a/a.txt");
boolean boo3 = f.renameTo(f4);
System.out.println(boo3);
}
}
1.5 File类的判断功能
函数名 | 解释 |
---|---|
exists() | 判断调用者描述的文件或者文件夹是否存在 |
isDirectory() | 判断调用者是不是一个文件夹 |
isFile() | 判断调用者是不是一个文件 |
isAbsolute() | 判断调用者描述的路径是不是一个绝对路径 |
代码
package demos3_file;
import java.io.File;
public class Demo05 {
public static void main(String[] args) {
File f1 = new File("day18");
System.out.println(f1.exists());
File f2 = new File("day18/src/demos3_file");
System.out.println(f2.exists());
File f3 = new File("C:\\Users\\ibm\\Desktop\\day18\\笔记\\day18笔记.doc");
//判断调用者对象锁维护的文件或者文件夹 是否存在
System.out.println(f3.exists());
//判断调用者维护的是不是一个文件夹
System.out.println(f1.isDirectory());
System.out.println(f2.isDirectory());
System.out.println(f3.isDirectory());
//判断调用者对象维护的是不是一个文件
System.out.println(f3.isFile());
//判断调用者对象中封装的是不是一个绝对路径
System.out.println(f1.isAbsolute());
System.out.println(f3.isAbsolute());
}
}
1.6 File类的获取功能
函数名 | 解释 |
---|---|
getAbsolutePath() | 返回绝对路径 |
getPath() | 获取相对路径 |
getName() | 获取调用者描述的文件名或者文件夹名 |
length() | 获取文件中的字节大小 |
list() | 获取当前调用者目录下所有的文件和文件夹的名称到一个字符串数组中 |
listFiles() | 获取当前调用者目录下所有文件和文件夹的名称之后,再将每个名称字符串 封装为一个个file对象,到一个File数组中。 |
对于
lenth()
方法来说,此方法只能适用于文件的对象使用,不适用于文件夹的对象
数据只能再文件中直接存储,不能直接再文件夹的存储
代码
package demos3_file;
import java.io.File;
public class Demo06 {
public static void main(String[] args) {
File f1 = new File("day18/src");
//获取绝对路径
System.out.println(f1.getAbsolutePath());
//获取相对路径
System.out.println(f1.getPath());
//获取文件或者文件夹的名称
System.out.println(f1.getName());
//获取文件的字节(如果是文件夹调用,返回值默认为0)
System.out.println(f1.length());
File f2 = new File("day18/src/demos3_file/a/a.txt");
//获取文件中数据 字节数
System.out.println(f2.length());
File f3 = new File("E:\\01_0803就业班");
//获取该对象所描述的目录下:每一个文件或者文件夹名称 到 字符串数组中
String[] list = f3.list();
for(String str:list){
System.out.println(str);
}
//获取该对象所描述目录下:每一个文件或者文件夹file对象 存到 File数组中
File[] fs = f3.listFiles();
for(File f:fs){
System.out.println(f.getName() + "...." + f.getAbsolutePath());
}
}
}
2 练习
键盘录入一个字符串,表示一个文件夹路径,如果不是文件夹路径则提示重新录入。
如果是文件夹路径则打印这一层目录下的所有文件名称
代码
package demos3_file;
import java.io.File;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
// 键盘录入一个字符串,表示一个文件夹路径,如果不是文件夹路径则提示重新录入,
// 如果是文件夹路径则打印这一层目录下的所有文件名称
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请录入一个文件夹路径:");
String str = sc.nextLine();
//判断str是不是文件夹
File f = new File(str);
if(f.isDirectory()){
//如果是文件夹,就打印该层目录下,有哪些文件,将文件名称打印
File[] fs = f.listFiles();
for(File ff:fs){
if(ff.isFile()){
System.out.println(ff.getName());
}
}
break;
}else{
System.out.println("不是一个文件夹路径");
}
}
}
}
3 递归
- 概念:递归是调用方法的一种方式
在Java语言中,方法自己调用自己就是递归 - 递归的特点:
(1)如果想要实现递归,该方法需要有两条分支:
第一条分支是方法调用自己的分支,是为了逐渐的解决问题
第二条分支是为了结束自己的分支,为了防止方法的无限调用 - 使用递归的好处:
使用一个方法,可以完成复杂的逻辑 - 缺点:
(1)使用递归,如果多次让方法进栈执行,可能出现一个栈内存溢出错误。
(2)使用递归,解决问题的效率比较低。 - 图示:
3.1 递归练习
观察如下数列的规律,使用递归的方式获取第20个值应该是多少?
1 , 1, 2,3 ,5 ,8 ,13 ,21 ,34 ,55 … (斐波那契数列)
利用规律:前两个数相加的和是下一个数
代码
package demos4_recursion;
public class Demo02 {
public static void main(String[] args) {
// 1、观察如下数列的规律,使用递归的方式获取第20个值应该是多少?
// 1 , 1, 2,3 ,5 ,8 ,13 ,21 ,34 ,55 ... (斐波那契数列)
System.out.println(getNum(30));
}
public static int getNum(int x){
if(x == 1){
return 1;
}else if(x == 2){
return 1;
}else{
return getNum(x-1) + getNum(x-2);
}
}
}