欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

【文件和递归】File:创建功能,删除功能,重命名功能,判断功能,基本获取功能,高级获取功能,断有没有.png后的文件,递归:归注意事项,用代码求出实现5的阶乘,不死神兔案例,递归删除带内容的目录

时间:2023-05-12
一、文件

我们想要实现IO操作,就必须要知道硬盘上文件的表现形式
Java提供了一个类让我们操作硬盘上的文件:File
File也就是文件表现形式

1.File:文件和目录(文件夹)路径名的抽象表示。 (1) 构造方法:

public File(String pathname)
通过将给定的路径名字符串转换为抽象路径名来创建新的
File实例。 如果给定的字符串是空字符串,则结果是空的抽象路径名。

2.public File(String parent,String child)
从父路径名字符串和子路径名字符串创建新的File实例。

3.public File(File parent,String child)
从父抽象路径名和子路径名字符串创建新的File实例。

public class FileDemo1 { public static void main(String[] args) { //public File(String pathname) 根据一个路径得到一个File对象 //F:demoa.txt封装成一个File对象 File file = new File("F:\shujia\demo\a.txt"); System.out.println(file); //public File(File parent,String child) //父的路径:F:shujiademo //子路径:b.txt File file1 = new File("F:\shujia\demo", "b.txt"); System.out.println(file1); //public File(File parent,String child) //父的路径:F:shujiademo //子路径:b.txt File file2 = new File("F:\shujia\demo"); File file3 = new File(file2, "b.txt"); System.out.println(file3); }}

(2) 创建功能

public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。

public boolean mkdir() :创建由此抽象路径名命名的目录,如果目标文件夹已经存在,就不创建了,返回false

public boolean mkdirs():创建多级文件夹

public class FileDemo2 { public static void main(String[] args) { //需求:我想在F盘下面创建一个文件夹demo2 //封装成File对象,不需要文件或者目录是否已经存在,它只//是将一个路径抽象的用File表示 //将来你可以用File类中的一些方法,来进行创建或者删除 File file = new File("F:\test"); System.out.println(file.mkdir()); //public boolean mkdir() 创建由此抽象路径名命名的目 //录,如果目标文件夹已经存在,就不创建了,返回false File file2 = new File("F:\test\a.txt"); try { //public boolean createNewFile()当且仅当具有该名称的 //文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 System.out.println(file2.createNewFile()); }catch (IOException i){ i.printStackTrace(); } //public boolean mkdirs() 创建多级文件夹 File file1 = new File("F:\dashuju\demo\demo1"); System.out.println(file1.mkdirs()); //注意1:要想在某个目录下创建文件,前提是该目录必须存在!! //此情况下该目录不存在所以就创建不了新的文件 File file3 = new File("F:\dashuju\demo\a.txt"); try { System.out.println(file3.createNewFile()); //系统找不到指定的路径。 }catch (IOException i){ i.printStackTrace(); //注意2:将来你要搞清楚是想要创建文件还是创建文件夹, //骑白马的不一定是王子,还有可能是唐僧 } }}

(3) 删除功能:

public boolean delete()

import java.io.File;import java.io.IOException;public class FileDemo3 { public static void main(String[] args) {//删除一个文件 File file = new File("F:\a.txt"); try { System.out.println(file.createNewFile()); }catch (IOException i){ i.printStackTrace(); } System.out.println(file.delete()); //删除一个多级文件夹 File file1 = new File("aaa\bbb\ccc"); System.out.println(file1.mkdirs()); System.out.println(file1.delete()); //此时只删除了ccc文件夹,要想删除aaa文件夹必须把aaa文件夹删除 //到为空为止 File file2 = new File("aaa\bbb"); System.out.println(file2.delete()); //此时又删除了bbb文件夹 //需求:我想删除aaa这个文件夹 //注意:要删除的目录必须是为空 File file3 = new File("aaa"); System.out.println(file3.delete()); //此时把aaa文件夹删除了 }}

(4)重命名功能

public boolean renameTo(File dest)

将文件夹a的名字改为大数据

public class FileDemo4 { public static void main(String[] args) { File file = new File("F:\a"); File file1 = new File("F:\大数据"); System.out.println(file.renameTo(file1)); }}

(5)判断功能

public boolean isDirectory() :判断是否是文件夹
public boolean isFile():判断是否是文件
public boolean exists():判断目标文件或者文件夹是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏

public class FileDemo5 { public static void main(String[] args) { //public boolean isDirectory() 判断是否是文件夹 File file = new File("F:\大数据"); System.out.println(file.isDirectory());//true //public boolean isFile() 判断是否是文件 System.out.println(file.isFile());//false //public boolean exists() 判断目标文件或者文件夹是否存在 System.out.println(file.exists());//true //public boolean canRead() 判断是否可读 System.out.println(file.canRead());//true //public boolean canWrite() 判断是否可写 System.out.println(file.canWrite());//true //public boolean isHidden() 判断是否隐藏 System.out.println(file.isHidden());//false }}

(6) 基本获取功能

public String getAbsolutePath():获取绝对路径,或者说完整路径,是带盘符的路径
public String getPath():获取相对路径,不带盘符
public String getName():获取名称
public long length():获取的长度是字节数
public long lastModified(): //1645064059299 精确到毫秒
//返回的是一个时间戳:值得是你在最后一次修改文件的时间,时间戳是在1970 1月 1日开始

import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;public class FileDemo6 { public static void main(String[] args) { //public String getAbsolutePath() //获取绝对路径,或者说完整路径,是带盘符的路径 File file = new File("大数据"); System.out.println(file.getAbsolutePath()); //F:softidea2021idea projects大数据 //public String getPath() //获取相对路径,不带盘符 System.out.println(file.getPath());//大数据 //public String getName() //获取名称 File file1 = new File("F:\大数据\a.txt"); System.out.println(file1.getName());//a.txt //public long length() //获取的长度是字节数 System.out.println(file1.length());//34 //public long lastModified() //1645064059299 精确到毫秒 //返回的是一个时间戳:值得是你在最后一次修改文件的时间, //时间戳是在1970 1月 1日开始 System.out.println(file1.lastModified()); //1645101188860 //java将时间戳与日期进行转换 //Date(long date) //分配一个 Date对象,并将其初始化为表示自称为“时代”的标 //准基准时间以后的指定毫秒数,即1970年1月1日00:00:00 GMT。 Date date = new Date(file1.lastModified()); System.out.println(date);//Thu Feb 17 20:33:08 CST 2022 //转换时间格式 SimpleDateFormat sp = new SimpleDateFormat("yyyy/MM/DD EEE HH:mm:ss"); System.out.println(sp.format(date)); //2022/02/48 星期四 20:33:08 }}

结果:

(6) 高级获取功能

public String[] list()
public File[] listFiles()

public class FileDEmo7 { public static void main(String[] args) { //public String[] list() //获取指定目录下的所有文件和文件夹的名称组成的数组 File file = new File("F:\dashuju\demo"); String[] list = file.list(); for (String list1:list){ System.out.println(list1);} System.out.println("============="); //public File[] listFiles() //获取指定目录下的所有文件和文件夹形成的File对象数组 File[] files = file.listFiles(); for (File files1:files){ System.out.println(files1); } }}

结果:

(7) 需求:判断D盘下面有没有.png后的文件,如果有,就输出此文件名称

分析: 1、将D盘根目录封装成一个File对象 2、获取该目录下所有的文件或者文件夹组成的File对象数组 3、遍历File数组,得到每一个File对象,然后判断是否是文件 是:继续判断是否以.jpg后缀 是:输出名称 不是:不管他 不是:不管他

方法一:

public class FileDemo8 { public static void main(String[] args) { File file = new File("F:\"); File[] files = file.listFiles(); for (File s:files){ if (s.isFile()){ if (s.getName().endsWith(".png")){ System.out.println(s.getName()); } } } }}

方法二:判断D盘下面有没有.jpg后的文件,如果有,就输出此文件名称

分析:
1、先获取所有的文件和文件夹,然后在遍历的时候,再去判断是否是文件,是否是.jpg后缀的,最后再将满足条件的文件过滤出来获取到名称。
2、在获取的时候,获取到的数据就是满足条件的,我们直接输出就可以了。

文件名称过滤器的实现思想及代码
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)

import java.io.File;import java.io.FilenameFilter;public class FileDemo9 { public static void main(String[] args) { File file = new File("F:\"); File[] files = file.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { //return false;// return true; //通过测试发现,目录下的文件或者文件夹该不该获取到,却决于这里的 //返回值 //true,就获取到加到数组,如果是false,就不获取,不加到数组中// System.out.println(dir);// System.out.println(name); File file1 = new File(dir, name); boolean f = file1.isFile(); boolean b = name.endsWith(".png"); return f && b; } }); for (File s:files) System.out.println(s); }}

二.递归 1、递归的概述

递归:方法定义中调用方法本身的现象

Math.max(Math.max(a,b),c) 这样的现象仅仅是方法的嵌套不是方法的递归使用

举例:
1、从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:

庙倒了,老和尚圆寂了。

2、学习大数据 – 高薪就业 – 挣钱 – 娶媳妇 – 生娃 – 挣学费:
学习大数据 – 高薪就业 – 挣钱 – 娶媳妇 – 生娃 – 挣学费:
学习大数据 – 高薪就业 – 挣钱 – 娶媳妇 – 生娃 – 挣学费:

娶不到媳妇,生不了娃。

2.递归注意事项

1、递归一定要有一个出口(结束条件),否则就成了死递归
2、递归的次数不能太多,否则会造成,栈内存溢出
3、构造方法不能发生递归

3.需求:用代码求出实现5的阶乘

分析:

5! = 5*4*3*2*1 = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1! 1、用循环解决 2、用递归解决

public class DiGui11 { public static void main(String[] args) { int s=1; for (int i=1;i<=5;i++){ s*=i; } System.out.println(s); System.out.println("5的阶层为:"+diGui(5)); } public static int diGui(int i){ if (i==1){ return 1; } else { return i*diGui(i-1); } }}

过程图:

4、不死神兔案例。假设有一对兔子,从出生的第三个月开始,每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子。

假设所有的兔子都不会死。问题:二十个月后,兔子的对数是多少?

分析: 找规律: 月份 兔子的对数 第一个月 1 第二个月 1 第三个月 2 第四个月 3 第五个月 5 第六个月 8 ... 由此课件,兔子的对数的数据是: 1,1,2,3,5,8,13,21,34... 规律: 1、从第三项开始,每一项都是前两项之和 2、说明前两项的数据是已知的怎么去实现呢? 1、数组实现 2、基本变量实现 3、递归实现

定义两个变量为相邻的数据 第1个相邻的数据: a=1,b=1 第2个相邻的数据: a=1,b=2 第3个相邻的数据:
a=2,b=3 第4个相邻的数据: a=3,b=5

规律:下一次相邻的数据,a的值是上一次b的值,b的值是上一次相邻数据的和a+b

public class DiGui12 { public static void main(String[] args) { //用数组实现 int[] arr=new int[20]; arr[0]=1; arr[1]=1; for (int i=2;i< arr.length;i++){ arr[i]=arr[i-1]+arr[i-2]; } System.out.println("第20个月后的兔子对数为"+arr[19]); System.out.println("============================="); //基本变量实现 //基本变量实现 //下一次相邻的数据,a的值是上一次b的值,b的值是上一次相邻数据的和a+b int a=1; int b=1; for (int i=0;i<19;i++){ int temp=a; a=b; b=temp+b; } System.out.println("第20个月后的兔子对数为"+a); System.out.println("第20个月后的兔子对数为"+diGui2(20)); } //定义的递归方法 public static int diGui2(int i){ if (i==1||i==2){ return 1; } else { return diGui2(i-1)+diGui2(i-2); } }}

结果:

5.遍历指定目录下所有的指定后缀名文件名称 如.java后缀

分析:
1、将目录封装成File对象
2、获取该目录下所有的File对象组成的数组
3、遍历数组得到每一个File对象
4、判断得到的File对象是一个文件还是一个文件夹
1、如果他是一个文件夹,回到第二步
2、如果他是一个文件,判断文件名称是否以.java后缀
如果是,输出
不是,跳过

public class DiGui13 { public static void main(String[] args) { File file = new File("F:\大数据"); diGui(file); } public static void diGui(File file){ File[] files = file.listFiles(); for (File f:files){ if (f.isDirectory()){ diGui(f); } else { if (f.getName().endsWith(".java")){ System.out.println(f.getName()); } }//bigdata.java } } }

6.递归删除带内容的目录

分析:
1、获取File对象
2、获取该目录下所有的文件和文件夹组成的File对象数组
3、遍历数组得到每一个File对象
4、判断这个File对象是否是文件夹
是:返回第二步
不是:直接删除

public class DiGUi14 { public static void main(String[] args) { File file = new File("F:\test"); delete2(file); } public static void delete2(File file){ File[] files = file.listFiles(); if (files!=null) { for (File file1 : files) { if (file1.isDirectory()) { delete2(file1); } else { System.out.println("删除的文件为:" + file1.getName()+"-- -------"+file1.delete()); } } System.out.println("删除的文件夹为:" + file.getName()+"- -------"+file.delete()); } }}

结果:

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。