目录
File类的操作
1.File类
1.1)文件和目录路径名的抽象表示形式
package com.qianfeng.file_01;
import java.io.File;
/**
* java.io.File
* 文件和目录路径名的抽象表示形式。
*
* 构造方法:
* public File(String pathname):里面当前文件夹/文件的路径 (推荐方式)
* public File(String parent,String child):parent的字符串路径名和child的字符串路径名构造一个File
* public File(File parent,String child):参数1:需要描述parent的字符串路径名和子文件字符串路径名:构造一个File
*
*
* URL:这个是URI的子集合(统一资源定位符)
* http://localhost:8080/web/login
*
* URI:(统一资源标识符):/web/login
* 网络协议:http://
* https://
* ftp://
* thunder://
* @author zhangyang
*
*/
public class FileDemo {
public static void main(String[] args) {
//描述:D盘下的demo文件夹:D:\demo\a.txt
//public File(String pathname):里面当前文件夹/文件的路径
File file = new File("d:\\demo\\a.txt") ;
System.out.println(file);//e:\demo\a.txt
System.out.println("------------------------------");
//描述:d盘下的demo文件夹中的a.txt文件
// public File(String parent,String child)
File file2 = new File("d:\\demo\\a.txt") ;
System.out.println(file2);//E:\demo\a.txt
System.out.println("------------------------------");
//描述:d盘下的demo文件夹中的a.txt文件
//public File(File parent,String child):
File file3 = new File("D:\\demo") ;
File file4 = new File(file3,"a.txt") ;
System.out.println(file4);//D:\demo\a.txt
}
}
1.2)File类的创建功能
package com.qianfeng.file_01;
import java.io.File;
import java.io.IOException;
/**
* File类的创建功能:
*
* public boolean createNewFile()throws IOException:创建文件
* public boolean mkdir():创建目录(文件夹):如果存在该文件夹,返回值false
* public boolean mkdirs():
* 创建目录(文件夹):创建多级目录,如果父目录不存在,会自动创建!
*
* 如果描述文件或者文件夹没有指定盘符,相对路径:默认是当前项目路径下
* @author zhangyang
*
*/
public class FileDemo2 {
public static void main(String[] args) throws IOException {
//需要在D盘下的text目录下创建一个a.txt文件
//1)描述这个路径:File
File file = new File("d:\\test\\a.txt") ;
//创建文件
//public boolean createNewFile()throws IOException
System.out.println("createNewFile():"+file.createNewFile());
//如果要在test目录下创建a.txt文件:File只是在描述路径:那么test目录必须存在!
// public boolean mkdir()
//d盘下:创建一个test文件夹
File file2 = new File("d:\\test") ;
System.out.println("mkdir():"+file2.mkdir());
System.out.println("------------------------------------");
//public boolean mkdirs():
File file3 = new File("d:\\aaa\\bbb\\ccc\\ddd") ;
System.out.println(file3.mkdirs());
//创建一个文件:b.txt
File file4 = new File("b.txt") ; //如果没有描述路径,在当前项目下创建文件:所处的相对路径
System.out.println(file4.createNewFile());
File file5 = new File("aaa\\bbb\\ccc\\ddd") ;
System.out.println(file5.mkdirs());
}
}
1.3)File类的删除功能
package com.qianfeng.file_01;
import java.io.File;
/**
* File类的删除功能
* public boolean delete():删除目录/文件,
* 如果删除的是目录,那么前提条件:目录必须为空
*
*
* @author zhangyang
*
*/
public class FileDemo3 {
public static void main(String[] args) {
//删除当前项目下的b.txt文件
//描述b.txt文件
File file = new File("b.txt") ;
//System.out.println(file);
//public boolean delete()
System.out.println("delete():"+file.delete());
System.out.println("-------------------");
//删除当前项目aaa这个目录
File file2 = new File("aaa\\bbb\\ccc\\ddd") ;
System.out.println(file2.delete());
//删除demo文件夹
//File file3 = new File("demo\\a.txt") ;
//System.out.println(file3.delete());
File file4 = new File("demo") ;
System.out.println(file4.delete());
}
}
1.4)File类重命名功能
package com.qianfeng.file_01;
import java.io.File;
/**
* 重命名功能:
* 针对某个文件操作
* public boolean renameTo(File dest):
*
* 需求:将当前项目下的高圆圆.jpg --- 杨桃.jpg
*
* 情况1:
* 当前文件的路径和该名后的路径相同,仅仅是改名字
*
* 情况2:
* 当前文件的路径名和该后面的路径名不相同,剪切并重命名
*
* @author zhangyang
*
*/
public class FileDemo4 {
public static void main(String[] args) {
//描述下当前项目下的高圆圆.jpg
//情况1:当前文件的路径和该名后的路径相同,仅仅是改名字
/*
File file = new File("高圆圆.jpg") ;
//public boolean renameTo(File dest):
File file2 = new File("杨桃.jpg") ;
System.out.println("renameTo():"+file.renameTo(file2)) ;
*/
//情况2:当前文件的路径名和该后面的路径名不相同,剪切并重命名
File file = new File("杨桃.jpg");
//该名后的路径
File file2 = new File("d:\\mm.jpg") ;
//調用方法
System.out.println("renameTo():"+file.renameTo(file2));
}
}
1.5) File类的判断功能
package com.qianfeng.file_01;
import java.io.File;
/**
* File的判断功能
*
* public boolean isFile():判断是否是文件
* public boolean isDirectory():判断是否是文件夹(目录)
* public boolean canRead():判断是否可读
* public boolean canWrite():判断是否可写
* public boolean exists():判断所file表示的文件/目录是否存在
* public boolean isAbsolute():判断是否是绝对路径
* public boolean isHidden():判断是否是隐藏文件
* @author zhangyang
*
*/
public class FileDemo5 {
public static void main(String[] args) {
File file = new File("a.txt") ;
System.out.println("isFile():"+file.isFile());
System.out.println("isDirectory():"+file.isDirectory());
System.out.println("canRead():"+file.canRead());
System.out.println("canWrite():"+file.canWrite());
System.out.println("exists():"+file.exists());
System.out.println("isAbsolute()():"+file.isAbsolute());
System.out.println("isHidden():"+file.isHidden());
}
}
1.6)File类的获取功能
package com.qianfeng.file_01;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* File类的获取功能
* 基本获取功能
*
* public String getAbsolutePath():获取绝对路径名
* public String getPath():当前文件所表示的路径
* public long length():获取文件长度
* public long lastModified():获取当前文件最后一次修改的时间(long:毫秒值)
*
*
*
*
* @author zhangyang
*
*/
public class FileDemo6 {
public static void main(String[] args) {
File file = new File("a.txt") ;
//public String getAbsolutePath()
System.out.println("getAbso():"+file.getAbsolutePath());//D:\JavaEE2008_workspace\day26\a.txt
//public String getPath()
System.out.println("getPath():"+file.getPath());//a.txt
System.out.println("length():"+file.length());
System.out.println("lastModified():"+file.lastModified());
//1604284636537
//long-----Date:日期格式java.util.Date
long time = 1604284636537L ;
Date date = new Date(time) ;
//Date----String:字符串文本格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
//格式化操作
String dateStr = sdf.format(date) ;
System.out.println(dateStr);//2020-11-02 10:37:16
}
}
1.7)File类的高级获取功能
package com.qianfeng.file_01;
import java.io.File;
/**
* 高级获取功能
* public File[] listFiles():获取的是某个盘符下/目录File数组(目录中的文件)
* public String[] list():获取某个盘符/目录的下的所有文件以及目录的字符串数组
*
*
* 需求:
* 获取当前d盘下的所有的以".jpg"结尾的文件!
*
* 分析:
* 1)描述下d盘符 d:\\
* File类描述
*
* 2)获取当前盘符下所有的文件/文件夹所表示字符串数组/目录下的文件的File数组
* 3)判断如果当前字符串数组或者File数组不为空,遍历获取到每一个文件/目录
* 4)判断当前file是否是表示的文件
* 再次判断是否以".jpg"结尾---->String --> endsWith(".jpg")
* 5)输出即可!
*
* @author zhangyang
*
*/
public class FileTest {
public static void main(String[] args) {
//描述下d盘符 d:\\
File file = new File("d:\\") ;
//System.out.println(file);
//public File[] listFiles()
File[] fileArray = file.listFiles() ;
//防止空指针
if(fileArray!=null) {
//遍历
for(File f:fileArray) {
//System.out.println(f);
//判断f对象是否描述的文件
if(f.isFile()) {
//是文件
//还需要判断:当前文件是否以.jpg结尾
if(f.getName().endsWith(".jpg")) {
//是以.jpg结尾
//输出
System.out.println(f.getName());
}
}
}
}
}
}
2.方法递归
package com.qianfeng.digui_02;
/**
* 什么是方法递归呢?
* 方法递归:
* 就是方法本身调用方法一种现象!
*
* Math.max(10,Math.max(40,70)) ; 方法嵌套方法
* 举例:
* 伪代码
* public void show(int n){ //10
* //出口条件(方法结束条件)
* if(n<0){
*
*
* System.exit(0) ;//Java虚拟机终止了
* }
* System.out.println(n) ;
* show(n--) ;
* }
*
* 递归:
* 1)必须定义一个方法:方法调用方法
* 2)满足一定的规律
* 3)方法必须有出口条件(结束条件)--->否则:就是死递归!
*
*
*注意事项:
* 构造方法不存在递归!
*
* @author zhangyang
*
*/
public class DiGuiDemo {
/*
public DiGuiDemo() {
DiGuiDemo();
}
*/
}
2.1)求5的阶乘
package com.qianfeng.digui_02;
/**
* 求5的阶乘
* 1)for循环思想
* n!= n*(n-1)!
* ....
* ...
*
* 2)递归的思想:
* 1)定义一个方法:方法还需要调用本身
* 2)有一定规律
* 3)出口条件
*
* 需求:如果有一对兔子,每三个月起产生一对兔子,小兔子经过三个月后有产生一对兔子,
* 假如兔子都不死,最终第二十个月有多少对兔子?
*
* 规律:
* 1)第一个月:1对
* 第二个月:1对
* 第三个月:2对
* 第四个月: 3对
* 第五个月:5对
* ...
* ...
*
*
* @author zhangyang
*
*/
public class DiGuiTest {
public static void main(String[] args) {
//求阶乘实现
//定义最终结果变量
int jc = 1 ;
for(int x = 1 ; x <= 5 ; x ++) {
jc *= x ;
}
System.out.println("5的阶乘是:"+jc);
System.out.println("5的阶乘是:"+getJc(5));
}
//获取最终结果
private static int getJc(int n) {//5
//出口条件
if(n==1) { // 5 * 4 * 3 * 2 * 1 ...
return 1 ;
}else {
return n*getJc(n-1) ; //5 * getJc(5-1)
}
/**
* 递归的思想:
* 分解法:
* 5!
* 5 * 4 !
* 4 * 3 !
* 3 * 2 !
* 2 * 1! 1!==1
*
*
*/
}
}
2.2)兔子生小兔子
package com.qianfeng.digui_02;
/*
需求:如果有一对兔子,从第三个月起产生一对兔子,小兔子经过第三个月后有产生一对兔子,
* 假如兔子都不死,最终第二十个月有多少对兔子?
*
* 规律:
* 1)第一个月:1对
* 第二个月:1对
* 第三个月:2对
* 第四个月: 3对
* 第五个月:5对
* 第六个月:8对
* ...
* 2)第一个月和第二个月兔子对数都是1
* 从第三个月开始,每个月兔子的对数等于前两个月兔子对数之和
*
* 解析
* 方式1:利用数组
* arr[1] arr[0]都是已知的 (角标值表示第几个月)
* 从第三个月开始,角标2开始,遍历数组 int[] arr = new int[20] ;
* arr[x] = arr[x-1]+arr[x-2];
*
* 方式2:变量的变化
* 将相邻两个月分别表示a,b
* 第一个月, 第二个月
* a = 1 ,b =1
* 第二个月, 第三个月
* a = 1,b = 2
* 第三个月 第四个月
* a = 2,b = 3
* 第四个月,第五个月
* a= 3,b = 5
* ....
* 下一次的a是上一次的b,下一次的b是上一次的a+b
*
* */
public class Test2 {
public static void main(String[] args) {
//方式1:数组的方式
//创建一个数组,动态初始化
int[] arr = new int[20] ;
//0-19:20个月
//第一个月
//第二个月都是1
arr[0] = 1 ;
arr[1] = 1 ;
//从第三个月开始,角标2开始,遍历数组
for(int x = 2 ; x < arr.length ; x ++) {
// 每个月兔子的对数等于前两个月兔子对数之和
arr[x] = arr[x-1] + arr[x-2] ;
}
System.out.println("第二十个月兔子的对数:"+arr[19]);
System.out.println("----------------------------------");
/**
* 方式2:变量的变化
* 将相邻两个月分别表示a,b
* 第一个月, 第二个月
* a = 1 ,b =1
* 第二个月, 第三个月
* a = 1,b = 2
* 第三个月 第四个月
* a = 2,b = 3
* 第四个月,第五个月
* a= 3,b = 5
* ....
* 下一次的a是上一次的b,下一次的b是上一次的a+b
*/
//定义两个变量:a,b来表示相邻两个月的数据
int a = 1 ;
int b = 1 ;
//前两个月已经存在值了
//18个月
for(int x = 0 ; x <18 ; x ++) {
//使用中间变量的方式
//使用temp变量记录一下的a
int temp = a ;
a = b ;
b = temp + a ;
}
System.out.println("第二十个月兔子的对数是:"+b);
System.out.println("-------------------------");
//递归的思想
/**
* 定义变量n: 表示第几个月
* 当前n==1或者n==2 都是1对兔子 出口条件(结束条件)
*
* 如果不是第一个月或者第二个月:从第三个月开始
* 方法名(n-1)+方法名(n-2)
*
*
*/
System.out.println("第二十个月兔子的对数是:"+getRabNum(20));
}
//n表示的第几个月
private static int getRabNum(int n) {
//出口 条件
if(n==1|| n==2) {
//第一个月或者第二个月的兔子对数都是1
return 1 ;
}else {
// 如果不是第一个月或者第二个月:从第三个月开始,每个月兔子对数等于前两个月之和
return getRabNum(n-1) + getRabNum(n-2) ;
}
}
}
2.3)需要删除带内容的目录(递归思想)
package com.qianfeng.digui_02;
import java.io.File;
/**
* 需求
* 需要删除带内容的目录
* 删除当前项目下:demo文件夹
*
* 分析:
* 1)描述下当前demo文件夹:File file = new File("demo") ;
* 2)定义一个方法:delete(file) 递归删除的方法(删除目录)
* 2.1)高级获取功能:获取当前file所表示的文件以及文件夹的File数组[]
* 2.2)判断当前File数组不为空
* 判断当前file是否是文件夹 isDirectory()
* 是文件夹,回到2)步继续调用
*
* 不是文件夹,是文件
* 直接删除:调用delete()删除(查看删除的是
* 那个文件:获取文件名称)
*
* 2.3)删除文件夹:调用delete()删除当前空目录
*
* @author zhangyang
*
*/
public class Test3 {
public static void main(String[] args) {
//1)使用File 描述当前项目下的demo文件夹
File srcFile = new File("demo") ;
//2)定义一个删除目录的方法
delete(srcFile) ;
}
private static void delete(File srcFolder) {
//获取srcFolder文件夹下面的所有文件以及文件夹的File数组
File[] fileArray = srcFolder.listFiles() ;
if(fileArray!= null) {
//遍历
for(File file :fileArray) {
//获取到每一个file对象,判断当前是否是文件夹
if(file.isDirectory()) {
//回到2)进行递归删除
delete(file);//aaa bbb ccc
}else {
//不是文件夹,直接删除
System.out.println(file.getName()+"---"+file.delete());
}
}
//删除目录
System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
}
}
}