Part01:File类
1、File类
- 是文件和目录路径名的抽象表示;
- 文件:可以直接保存数据;
- 目录路径名(文件夹):分类管理文件;
2、File类构造方法:
- File(File parent, String child) //父文件,子路径
File file2 = new File("~/Desktop/Java进阶");
File file3 = new File(file2,“Day10”); - File(String pathname)//路径名
File file = new File("~/Desktop/Java进阶/Day10"); - File(String parent, String child) //父路径,子路径
File file1 = new File("~/Desktop/Java进阶",“Day10”);
3、File类的获取方法:
- public String getAbsolutePath( );//获取绝对路径
- public String getName( );//获取当前File对象的名字
- public String getPath( );//获取创建File对象时传递的路径
- public long length( );//获取表示文件的File对象占用的字节数,如果是文件夹的File对象,返回值不确定
4、File对象的删除、判断和创建方法
- 创建方法
- 创建文件:public boolean createNewFile( );//只能创建文件,返回是否创建成功(若文件已存在则创建失败)
- 创建文件夹:public boolean mkdir( );//只能创建文件夹,返回是否创建成功(若文件夹已存在则创建失败)
- 判断方法
- 判断是否是文件:public boolean isFile( );//返回是否是文件
- 判断是非是文件夹:public boolean isDirectory( );//返回是否是文件夹
- 判断文件或文件夹是否存在:public boolean exists( );//返回File对象是否存在
- 删除方法
- 删除文件或者文件夹:public boolean delete( );//删除的是单个文件或者是空文件夹,不经过回收站,返回是否删除成功
5、File类的list和listFile方法
- public String[ ] list( );//列出一个文件夹下的所有东西,以字符串数组形式返回,只返回文件的名字
- public File[ ] listFiles( );//列出一个文件夹下的所有东西,以文件数组形式返回,返回文件的绝对路径
注意⚠️:
- 只能列出当前文件夹下的一级子文件和子文件夹
- 指定的目录必须是存在的
- 指定的必须是目录
(否则容易返回数组为null,再使用这个数组时会出现空指针异常(NullPointException))
拓展:若想删除一个非空文件夹下的所有文件
可通过listFiles方法获取该文件夹下的所有文件,然后遍历这个文件数组,在遍历的过程中删除文件;
File[] files = file.listFiles();
for (File f:files
) {
//System.out.println(f);
boolean b = f.delete();
//System.out.println(b);
}
Part02:递归
1、递归:
- 是一个通用技术;
- 所有编程语言,只要有方法的概念的编程语言都具有递归;
- 指的是在一个方法内部,再调用方法本身
注意⚠️:无限递归本身是错误的:因为方法运行需要进栈,而栈空间不是无限大的;多次递归之后会容易出现栈内存溢出(StackOverflowError)
2、使用递归的前提:
- 必须有一个可以使递归结束的条件
- 递归的次数不能太多
- 构造方法禁止使用递归
public static void main(String[] args){
test(5);
}
public static void test(int num){
if(num<0){
return;
}
System.out.println("test...");
num--;
test(num);
}
⚠️建议在开发中,能不用递归就不用递归,因为递归急剧消耗内存;
3、递归的分类:
- 直接递归:在A方法的内部,直接调用A方法;
- 间接递归:在A方法的内部调用B方法,在B方法的内部调用C方法,在C方法的内部调用A方法 ;
4、递归的练习:
- 使用递归求和:1+2+3+4+…+n
public static int getSum(int n){
if(n==1){
return n;
}
return getSum(n-1)+n;
}
- 使用递归遍历文件夹下的所有文件(包括一级的也包括n级的)
public static void main(String[] args){
File file = new File("/Users/feng/Desktop/Java进阶/Day04");
DiGuiFile(file);
}
//列出一个文件夹下的文件
public static void DiGuiFile(File file){
File[] files = file.listFiles();
//遍历该文件夹下的所有文件
for(File f:files
) {
//判断是否为文件夹,若为文件夹,接着列出该文件夹下的所有文件
if(f.isDirectory()){
DiGuiFile(f);
}
System.out.println(f);
}
}
Part03:文件过滤器
1、文件过滤器FileFilter:
在list和listFiles方法中使用;
列出以.txt结尾的文件:
//过滤器类实现FileFilter接口
public class MyFileFilter implements FileFilter {
@Override
//重写过滤条件
public boolean accept(File pathname) {
if(pathname.getName().endsWith(".txt")){
return true;
}
return false;
}
}
//使用
public class FileFilterDemo {
public static void main(String[] args){
File file = new File("/Users/feng/Desktop/Java进阶/Day10");
MyFileFilter myFileFilter = new MyFileFilter();
File[] files = file.listFiles(myFileFilter);
for (File f:
files) {
System.out.println(f);
}
}
}
Part04:嵌套Map集合的遍历
public class MapDiGuiDemo {
public static void main(String[] args){
//第一个学院的学生姓名和学号
Map<String,String> eeMap = new LinkedHashMap<String, String>();
eeMap.put("001","张三");
eeMap.put("002","李四");
eeMap.put("003","王五");
//第二个学院的学生姓名和学号
Map<String,String> uiMap = new LinkedHashMap<String, String>();
uiMap.put("001","小明");
uiMap.put("002","小红");
uiMap.put("003","小米");
//第三个学院的学生姓名和学号
Map<String,String> ppMap = new LinkedHashMap<String, String>();
ppMap.put("001","老王");
ppMap.put("002","道长");
ppMap.put("003","小四");
//把这三个学院放入一个Map集合中
Map<String,Map<String,String>> zMap = new LinkedHashMap<String,Map<String,String>>();
zMap.put("javaee",eeMap);
zMap.put("ui",uiMap);
zMap.put("php",ppMap);
//遍历这个Map集合
Set<Map.Entry<String,Map<String,String>>> zset = zMap.entrySet();
Iterator<Map.Entry<String,Map<String,String>>> zit = zset.iterator();
while (zit.hasNext()){
Map.Entry<String,Map<String,String>> entry = zit.next();
String key = entry.getKey();
Map<String,String> value = entry.getValue();
//打印这个Map集合的键
System.out.println(key);
//遍历这个Map集合中的Map集合
Set<String> keys = value.keySet();
for (String k:keys
) {
String value1 = value.get(k);
//这个Map集合中的Map集合的键值对
System.out.println(k+":"+value1);
}
}
}
}