我们想要实现IO操作,就必须要知道硬盘上文件的表现形式
Java提供了一个类让我们操作硬盘上的文件:File
File也就是文件表现形式
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
}
}
结果:
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);
}
}
}
结果:
分析: 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) 这样的现象仅仅是方法的嵌套不是方法的递归使用
2.递归注意事项举例:
1、从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
从前有座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
…
庙倒了,老和尚圆寂了。2、学习大数据 – 高薪就业 – 挣钱 – 娶媳妇 – 生娃 – 挣学费:
学习大数据 – 高薪就业 – 挣钱 – 娶媳妇 – 生娃 – 挣学费:
学习大数据 – 高薪就业 – 挣钱 – 娶媳妇 – 生娃 – 挣学费:
…
娶不到媳妇,生不了娃。
3.需求:用代码求出实现5的阶乘1、递归一定要有一个出口(结束条件),否则就成了死递归
2、递归的次数不能太多,否则会造成,栈内存溢出
3、构造方法不能发生递归
分析:
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);
}
}
}
结果:
分析:
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());
}
}
}
结果:



