File类
其构造函数有四个,最后一个传入URI的
- File(String pathname):根据一个路径得到File对象
- File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
- File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
一道题说明File过滤器
如何 实现 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称(注意以下代码只是返回文件名,并不是操作文件.)
方法有两种….
/* 1, 没有使用过滤器的 */
File dir = new File("E:\\");
String[] filename = dir.list();
for (String name : filename) {
if(name.endsWith(".jpg")){
System.out.println(name);
}
}
/* 2, 使用过滤器版本的操作.*/
File dir = new File("E:\\");
String[] filename = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// System.out.println(dir);
// System.out.println(name);
//当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false
return name.endsWith(".jpg")?true:false;
}
});
for (String name : filename) {
System.out.println(name);
}
File类(递归)
- 5的阶乘
- 递归调用的弊端:不能调用的次数过多(7000次左右),容易导致栈内存溢出
- 递归调用的好处:不用知道循环的次数
- 构造方法是不可使用递归的。
- 递归不一定需要返回值(类似文件夹查找不需要返回值)
File类(练习)
- 需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
分析:
- 从键盘接收一个文件夹路径
- 1,如果录入的是不存在,给与提示
- 2,如果录入的是文件路径,给与提示
- 3,如果是文件夹路径,直接返回
-
- 打印出该文件夹下所有的.java文件名
- 1,获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中
- 2,遍历数组,对每一个文件或文件夹做判断
- 3,如果是文件,并且后缀是.java的,就打印
- 4,如果是文件夹,就递归调用
实例1、
获取一个文本上每个字符出现的次数,将结果写在times.txt上
*
* 分析:
* 1,创建带缓冲的输入流对象
* 2,创建双列集合对象TreeMap
* 3,将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将该键和值加1存储
* 4,关闭输入流
* 5,创建输出流对象
* 6,遍历集合将集合中的内容写到times.txt中
* 7,关闭输出流
File类递归练习(统计该文件夹大小)
需求:1,从键盘接收一个文件夹路径,统计该文件夹大小
逻辑思路:
从键盘接收一个文件夹路径- 1,创建键盘录入对象
- 2,定义一个无限循环
- 3,将键盘录入的结果存储并封装成File对象
- 4,对File对象判断
5,将文件夹路径对象返回
统计该文件夹大小
- 1,定义一个求和变量
- 2,获取该文件夹下所有的文件和文件夹listFiles();
- 3,遍历数组
- 4,判断是文件就计算大小并累加
- 5,判断是文件夹,递归调用
File类递归练习(删除该文件夹)
- 需求:2,从键盘接收一个文件夹路径,删除该文件夹
删除该文件夹
分析:
- 1,获取该文件夹下的所有的文件和文件夹
- 2,遍历数组
- 3,判断是文件直接删除
- 4,如果是文件夹,递归调用
- 5,循环结束后,把空文件夹删掉
File类递归练习(拷贝)
- 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
分析:
- 1,在目标文件夹中创建原文件夹
- 2,获取原文件夹中所有的文件和文件夹,存储在File数组中
- 3,遍历数组
- 4,如果是文件就用io流读写
- 5,如果是文件夹就递归调用
File类递归练习(按层级打印)那个lev值++lev和lev++都是效果不同的,因为递归调用时不需要改变原来的lev
需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如:
aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来
aaa
bbb.txt
ccc.txt
ddd.txteee fff.txt ggg.txt
分析:
* 1,获取所有文件和文件夹,返回的File数组
* 2,遍历数组
* 3,无论是文件还是文件夹,都需要直接打印
* 4,如果是文件夹,递归调用
23.05_递归练习(斐波那契数列)
- 不死神兔
- 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
- 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,
- 问:一对刚出生的兔子,一年内繁殖成多少对兔子?
- 1 1 2 3 5 8 13
- 第一个月一对小兔子 1
- 第二个月一对大兔子 1
- 第三个月一对大兔子生了一对小兔子 2
- 第四个月一对大兔子生了一对小兔子
- 一对小兔子长成大兔子 3
- 第五个月两对大兔子生两对小兔子
- 一对小兔子长成大兔子 5
递归练习(1000的阶乘所有零和尾部零的个数)
- 需求:求出1000的阶乘所有零和尾部零的个数,不用递归做
递归练习(1000的阶乘尾部零的个数)
- 需求:求出1000的阶乘尾部零的个数,用递归做
约瑟夫环(笔试题)
- 幸运数字
/*
* 获取幸运数字
* 1,返回值类型int
* 2,参数列表int num
*/
public static int getLucklyNum(int num) {
//创建集合存储1到num的对象
ArrayList<Integer> list = new ArrayList<>();
//将1到num存储在集合中
for(int i = 1; i <= num; i++) {
list.add(i);
}
//用来数数的,只要是3的倍数就杀人
int count = 1;
//只要集合中人数超过1,就要不断的杀
for(int i = 0; list.size() != 1; i++) {
//如果i增长到集合最大的索引+1时
if(i == list.size()) {
i = 0; //重新归零
}
//如果是3的倍数
if(count % 3 == 0) {
//就杀人,此处的关键是i--将其游标拉回一个位置
list.remove(i--);
}
count++;//不断的点数
}
return list.get(0);
}