该复习笔记是基于传智播客的Java基础视频-深入简出精华版,链接: https://pan.baidu.com/s/1bp7NuOJ,建议刚刚入门的小白不要看,因为涉及太多的细节了,看多了反而让你容易放弃Java之路,刚刚入门的小白推荐下面这一套视频-链接:https://pan.baidu.com/s/1pLuAj5x
博主声明一下:我不是传智播客的什么托,只是一个菜鸟,现在在补着Java基础,搞了一套传智播客的Java视频以及Android视频,所以笔记可能会常出现这些字眼,请言语讽刺我是托的麻烦你闭嘴哈
File类递归调用
File类递归调用(统计特定文件夹的大小)
需求:1,从键盘接收一个文件夹路径,统计该文件夹大小
public class Test1 {
/**
* @param args
* 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小
*
* 从键盘接收一个文件夹路径
* 1,创建键盘录入对象
* 2,定义一个无限循环
* 3,将键盘录入的结果存储并封装成File对象
* 4,对File对象判断
* 5,将文件夹路径对象返回
*
* 统计该文件夹大小
* 1,定义一个求和变量
* 2,获取该文件夹下所有的文件和文件夹listFiles();
* 3,遍历数组
* 4,判断是文件就计算大小并累加
* 5,判断是文件夹,递归调用
*/
public static void main(String[] args) {
File dir = getDir();
System.out.println(getFileLength(dir));
}
public static File
getDir() {
Scanner sc =
new Scanner(System.in);
System.out.println(
"请输入一个文件夹路径:");
while(
true) {
String line = sc.nextLine();
File dir =
new File(line);
if(!dir.exists()) {
System.out.println(
"您录入的文件夹路径不存在,请输入一个文件夹路径:");
}
else if(dir.isFile()) {
System.out.println(
"您录入的是文件路径,请输入一个文件夹路径:");
}
else {
return dir;
}
}
}
public static long getFileLength(File dir) {
long len =
0;
File[] subFiles = dir.listFiles();
for (File subFile : subFiles) {
if(subFile.isFile()) {
len = len + subFile.length();
}
else {
len = len + getFileLength(subFile);
}
}
return len;
}
}
File类递归调用(删除该文件夹)
需求:2,从键盘接收一个文件夹路径,删除该文件夹
public class Test2 {
/**
* 需求:2,从键盘接收一个文件夹路径,删除该文件夹
*
* 删除该文件夹
* 分析:
* 1,获取该文件夹下的所有的文件和文件夹
* 2,遍历数组
* 3,判断是文件直接删除
* 4,如果是文件夹,递归调用
* 5,循环结束后,把空文件夹删掉
*/
public static void main(String[] args) {
File dir = Test1.getDir();
deleteFile(dir);
}
public static void deleteFile(File dir) {
File[] subFiles = dir.listFiles();
for (File subFile : subFiles) {
if(subFile.isFile()) {
subFile.delete();
}
else {
deleteFile(subFile);
}
}
dir.delete();
}
public static File
getDir() {
Scanner sc =
new Scanner(System.in);
System.out.println(
"请输入一个文件夹路径:");
while(
true) {
String line = sc.nextLine();
File dir =
new File(line);
if(!dir.exists()) {
System.out.println(
"您录入的文件夹路径不存在,请输入一个文件夹路径:");
}
else if(dir.isFile()) {
System.out.println(
"您录入的是文件路径,请输入一个文件夹路径:");
}
else {
return dir;
}
}
}
}
File类递归调用(拷贝文件夹)
需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
public class Test3 {
/**
* 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
*
* 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
* 分析:
* 1,在目标文件夹中创建原文件夹
* 2,获取原文件夹中所有的文件和文件夹,存储在File数组中
* 3,遍历数组
* 4,如果是文件就用io流读写
* 5,如果是文件夹就递归调用
* @throws IOException
*/
public static void main(String[] args)
throws IOException {
File src = Test1.getDir();
File dest = Test1.getDir();
if(src.equals(dest)) {
System.out.println(
"目标文件夹是源文件夹的子文件夹");
}
else {
copy(src,dest);
}
}
public static void copy(File src, File dest)
throws IOException {
File newDir =
new File(dest, src.getName());
newDir.mkdir();
File[] subFiles = src.listFiles();
for (File subFile : subFiles) {
if(subFile.isFile()) {
BufferedInputStream bis =
new BufferedInputStream(
new FileInputStream(subFile));
BufferedOutputStream bos =
new BufferedOutputStream(
new FileOutputStream(
new File(newDir,subFile.getName())));
int b;
while((b = bis.read()) != -
1) {
bos.write(b);
}
bis.close();
bos.close();
}
else {
copy(subFile,newDir);
}
}
}
}
File类递归调用(按层级打印)
需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如: aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来
public class Test4 {
/**
* 需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如:
* 把文件夹中的所有文件以及文件夹的名字按层级打印
* 分析:
* 1,获取所有文件和文件夹,返回的File数组
* 2,遍历数组
* 3,无论是文件还是文件夹,都需要直接打印
* 4,如果是文件夹,递归调用
* day07
* day08
* xxx.jpg
* yyy.txt
* Demo1_Consturctor.class
* Demo1_Consturctor.java
* Demo1_Student.class
* Demo1_Student.java
*/
public static void main(String[] args) {
File dir = Test1.getDir();
printLev(dir,
0);
}
public static void printLev(File dir,
int lev) {
File[] subFiles = dir.listFiles();
for (File subFile : subFiles) {
for(
int i =
0; i <= lev; i++) {
System.out.print(
"\t");
}
System.out.println(subFile);
if(subFile.isDirectory()) {
printLev(subFile,lev+
1);
}
}
}
}
斐波那契数列
不死神兔故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,问:一对刚出生的兔子,一年内繁殖成多少对兔子?1 1 2 3 5 8 13第一个月一对小兔子 1第二个月一对大兔子 1第三个月一对大兔子生了一对小兔子 2第四个月一对大兔子生了一对小兔子一对小兔子长成大兔子 3第五个月两对大兔子生两对小兔子 一对小兔子长成大兔子 5
public static void main(String[] args) {
System.
out.println(fun(
8));
}
public static int fun(
int num) {
if (num ==
1 || num ==
2) {
return 1;
}
else {
return fun(num -
2) + fun(num -
1);
}
}
1000的阶乘尾部零的个数(递归)
需求:求出1000的阶乘尾部零的个数,用递归做
public int fun(
int num) {
if(num >
0 && num <
5) {
return 0;
}
else {
return num /
5 + fun(num /
5);
}
}
递归的高级使用-汉诺塔问题
前言:如果你跟我一样,看文章感觉很累的话,那么可以尝试一下看这个连小白都可以看得懂的那个参考视频
参考文章: 1.Hanoi Tower 汉诺塔的简单分析/C - Geek_Ling - 博客园 2.Java经典编程300例之实例047 汉诺塔问题求解(递归) - - 博客频道 - .NET
参考视频: 1.百度网盘链接: https://pan.baidu.com/s/1nuEP9CP 密码: 9ie9
主要代码:
public class HanoiTower {
/**
* 移动盘子
* topN:移动的盘子数
* from:起始塔座
* inter:中间塔座
* to:目标塔座
*/
public static void doTower(
int topN,
char from,
char inter,
char to) {
if(topN ==
1) {
System.out.println(
"盘子1,从"+ from +
"塔座到" + to +
"塔座");
}
else {
doTower(topN -
1, from, to, inter);
System.out.println(
"盘子" + topN +
",从" + from +
"塔座到" + to +
"塔座" );
doTower(topN -
1, inter, from, to);
}
}
}
测试代码:
HanoiTower
.doTower(
3,
'A',
'B',
'C')
运行结果:
第三篇复习连接: Java基础复习(三) - it菜鸟的飞行梦 - 博客频道 - .NET
第三篇复习连接: Java基础复习(五) - it菜鸟的飞行梦 - 博客频道 - .NET