【小白学Java】D28》》》IO流 之 File类 & 递归

在这里插入图片描述


【友情链接】➡➡▶IO流 之 File类 & 递归
【友情链接】➡➡▶IO流 之 过滤器 & 字节流
【友情链接】➡➡▶IO流 之字符流 & 属性集(Properties集合)
【友情链接】➡➡▶IO流 之 缓冲流 & 转换流
【友情链接】➡➡▶IO流 之 序列化流 & 打印流


一、了解File类

(1)File概述

        java.io包下的 File类是对文件和目录路径名的抽象表示,File类主要用于对文件和目录的创建、查找和删除等操作。

  • 文件和目录可以通过File封装成对象
  • File封装的并不是一个具体的文件,只是文件的路径,而这个路径可以存在或不存在,然后可以通过具体的操作把这个路径转化为具体的存在。

注意:File类是一个与系统无关的类,任何的操作系统都可以使用这个类以及类中的方法。

//使用File类常见的单词
			file  : 文件
			directory : 目录(文件夹)
			path  :  路径

(2)File类的静态成员变量

/*File类常见的成员变量
*
 *  1.与系统有关的路径分隔符:
* static String pathSeparator   :为方便,表示为一个字符串。
* static char pathSeparatorChar :表示为字符
*
* 2.与系统有关的默认名称分隔符:
* static String separator       :为方便,表示为一个字符串。
* static char separatorChar     :表示为字符
* */

//与系统有关的路径分隔符:Windows下是分号‘ ; ’  Linux下是冒号‘ : ’
String pathSeparator = File.pathSeparator;
System.out.println("pathSeparator:\t"+pathSeparator);
char pathSeparatorChar = File.pathSeparatorChar;
System.out.println("pathSeparatorChar:\t"+pathSeparatorChar);

//与系统有关的默认名称分隔符:Windows下是反斜杠'\ '  Linux下是正斜杠 '/ '
String separator = File.separator;
System.out.println("separator:\t"+separator);
char separatorChar = File.separatorChar;
System.out.println("separatorChar:\t"+separatorChar);

看下打印结果:
在这里插入图片描述

1.与系统有关的路径分隔符:
Windows下是分号‘ ;Linux下是冒号‘ :2.与系统有关的默认名称分隔符:
 Windows下是反斜杠'\ '  Linux下是正斜杠 '/ '

 Windows下目录为: C:\a\b.txt           
 Linux下目录为:   C:/a/b.txt  

        我们在开发时,写的程序是要兼容多系统的,不仅仅要在Windows上执行还要能在Linux、Unix等操作系统中执行,所以路径就不能写死了,那么,我们就可以采用字符串拼接来解决这种问题
"C:"+File.separator+"a"+File.separator+"b.txt"

(3) 绝对路径和相对路径

  1. 绝对路径:一个完整的路径,以盘符(c 、D、F、e等)开始的路径,例如c:\\abc.txtC:\\test\a\1.txt

  2. 相对路径:一个简化的路径,
    相对:指相对于当前项目的根目录(C:\ \ test \ a),那么,路径就可以简化了,C:\\test\a\1123.txt–>简化为1123.tx这样就省略了项目的根目录

注意:

  • 1.路径不区分大小写
  • 2.路径中的文件名称分隔符,在Windows下使用的反斜杠,而一个反斜杠表示的是转义字将,两个反斜扛才表示一个普通的反斜扛

(4)File类的构造方法

第一种:

FiLe(String pathname)
将给定路径名字符串 转换为 抽象路径名 来创建一个新FiLe实例。

注意:

  • 路径既能以文件结尾,也能以文件夹结尾
  • 路径既可以为相对路径,也可以为绝对路径
  • 路经可以是真实存在的,也可以是不存在的
  • 创建的FiLe对象只是把字符串路径封装为FiLe对象,而并不考虑路径是否真是存在
//创建一个file对象
File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\sj\\javabase\\file");
System.out.println(file);
//打印结果 D:\BigData\java\javalearn\src\com\sj\javabase\file --->目录
//new的是一个对象,但打印出来的是一个路径,说明了File类重写了toString方法

File file1 = new File("D:\\BigData\\java\\javalearn\\src\\com+\\sj\\javabase\\abc.txt");
System.out.println(file1);
//D:\BigData\java\javalearn\src\com\sj\javabase\abc.txt --->文件

//相对路径
File file2 = new File("123.txt");
System.out.println(file2);

在这里插入图片描述

第二种:

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

优点:
父路径和子路径,分开了可以单独书写,
使用起来会很灵活,父路径和子路经都可以改变
File file3 = new File("D:\\BigData\\java\\javalearn\\src\\com\\sj\\javabase\\file", "abc.txt");
System.out.println(file3);

在这里插入图片描述

第三种:

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

优点:
1.父路径和子路径,分开了可以单独书写,
		使用起来会很灵活,父路径和子路经都可以改变
2.父路径是File类型,可以使用FiLe类的方法对路径进行一些操作,
					然后可以再使用路径来创建对象.

在这里插入图片描述

(5)File常用方法

(一)、获取功能以及遍历功能的方法

获取功能:

public String getAbsolutePath(): 返回此File的绝对路径名字符串。
public String getPath():  将此File转换为路径名字符串。
public string getName():  返回由此File表示的文件或目录的名称。

遍历功能:
public String[] list():   返回File表示的目录下的目录和文件的名称
public File[] listFile():  返回File表示的目录下的目录和文件的对象


public long length() :   返回由此File表示的文件的长度。
  (以字节为单位,注意文件夹是没有大小的,
   如果构造方法中给的路径名不存在,那么返回值为0

下面我们来详细的看一下各个方法的使用:
已有目录结构:
在这里插入图片描述
在这里插入图片描述

//1.public String getAbsolutePath(): 返回此File的绝对路径名字符串。
//绝对路径file
File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\abc.txt");
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);
//返回file的构造方法中的D:\BigData\java\javalearn\src\com\xiaobei\iostream\file\abc.txt

//相对路径file1---————>相对的路径为 D:\BigData\java\javalearn
File file1 = new File("abc.txt");
String absolutePath1 = file1.getAbsolutePath();
System.out.println(absolutePath1);
//返回file1的构造方法中的绝对路径 D:\BigData\java\javalearn\abc.txt

System.out.println("-------------------------");
//2.public String getPath():  将此File转换为路径名字符串,返回的为构造方法中的路径
String path = file.getPath();
System.out.println(path);
//返回file的构造方法中的路径名D:\BigData\java\javalearn\src\com\xiaobei\iostream\file\abc.txt
String path1 = file1.getPath();
System.out.println(path1);//返回file1的构造方法中的路径名abc.txt

System.out.println("--------------------------");
//3.public string getName():  返回由此File表示的文件或目录的名称。
File file2 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file01");
String name = file.getName();
System.out.println(name);//返回file的文件名abc.txt
String name1 = file2.getName();
System.out.println(name1);//返回file2的文件夹名file01

System.out.println("--------------------------");
//4.public long length() :   返回由此File表示的文件的长度。
//文件存在
long length = file.length();
System.out.println(length);//file路径的文件abc.txt中文件长度 返回  96
//文件不存在
long length1 = file2.length();
System.out.println(length1);//file2构造方法中路径为目录 返回  0



//文件夹的遍历功能
System.out.println("--------------------------");
//5.public String[] list():   返回File表示的目录下的目录和文件的名称
File file3 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file");
String[] list = file3.list();
for (String s : list) {
    System.out.println(s);
}

System.out.println("--------------------------");
//6.public File[] listFile():  返回File表示的目录下的目录和文件的对象
File[] files = file3.listFiles();
for (File file4 : files) {
    System.out.println(file4);
}

在这里插入图片描述

(二)、判断功能的方法

1.public boolean isDirectory()  判断file是否为目录 
2.public boolean isFile()       判断file是否为文件
3.public boolean exists()       判断file是否存在
注意:
1.方法12有个使用前提
      就是当前要判断的路径需要是真实存在的,否则都返回false
2.方法1和方法2是互斥的

下面我们来详细的看一下各个方法的使用:

//1.public boolean exists()       判断file是否存在
 File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\abc.txt");
 boolean exists = file.exists();
 System.out.println(exists);//true

 File file1 = new File("D:\\BigData\\java\\javalearn\\abc.txt");
 boolean exists1 = file1.exists();
 System.out.println(exists1);//false

 System.out.println("-------------------------");
 //2.public boolean isDirectory()  判断file是否为目录
 boolean directory = file.isDirectory();
 System.out.println(directory);//false
 File file2 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file");
 boolean directory1 = file2.isDirectory();
 System.out.println(directory1);//true

 System.out.println("-------------------------");
 //3.public boolean isFile()       判断file是否为文件
 boolean file3 = file.isFile();
 System.out.println(file3);//true
 boolean file4 = file2.isFile();
 System.out.println(file4);//false

在这里插入图片描述

(三)、创建功能的方法

1.public boolean createNewFile()
当且仅当具有该名称的文件尚不存在时
           创建一个由该file路径名命名的新的空文件。 
方法的返回值:布尔值
		true: 文件不存在,创建文件,返回true
		false: 文件存在,不会创建,返回foLse
注意事项;
      1.该方法只能创建文件不能创建文件夹
      2.创建文件的路径必须存在,不然就会抛出异常
      3.createNewFile声明抛出了IOException ,
        调用这个方法,必须的处理异常,要么throws ,要么try catch


2.public boolean mkdir() 
    创建由此file路径名命名的目录,只能创建单级文件夹

3.public boolean mkdirs() 
 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
  可以创建多级文件夹
 

下面来看一下详细代码;
创建目录前:
在这里插入图片描述

public static void main(String[] args) throws IOException {
   //1.public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
     File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\a.txt");
     boolean newFile = file.createNewFile();
     System.out.println(newFile);//true
     //要创建的文件已存在
     File file1 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\abc.txt");
     boolean newFile1 = file1.createNewFile();
     System.out.println(newFile1);//false

     System.out.println("------------------------");
     //2.public boolean mkdir():创建由此FiLe表示的目录。
     File file2 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file03");
     boolean mkdir = file2.mkdir();
     System.out.println(mkdir);//true

     File file3 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file01");
     boolean mkdir1 = file3.mkdir();
     System.out.println(mkdir1);//false

     System.out.println("------------------------");
     //3.public boolean mkdirs():创建由此FiLe表示的目录,包括任何必需但不存在的父目录。
     File file4 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file04\\file05");
     boolean mkdirs = file4.mkdirs();
     System.out.println(mkdirs);//true

 }

在这里插入图片描述

(四)、删除功能的方法

public boolean delete()删除抽象路径表示的文件或目录 

注意:
   删除目录时,如果目录下有内容,那么就不能直接删除,
         而需要先删除目录中的内容后再删除目录

//4.public boolean delete() :删除由此FLe表示的文件或目录。
File file5 = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file\\file02");
boolean delete = file5.delete();
System.out.println(delete);//true

在这里插入图片描述

二、了解递归

(一)、概念

        递归就是指在方法中调用方法本身,也就是说当要实现的某个功能的思想逻辑是重复的,也就是每一层的代码是类似的,那么就可采用递归来实现,只需要少量的程序就可以搞定解决问题过程中的多次重复计算,可以节约大量的代码量。

(二)、递归的分类

递归分为两种,直接递归和间接递归。

  • 直接递归指:方法自身调用自己。
public void function1(){
		function1();
}
  • 间接递归指:方法1调用方法2,方法2调用方法3,方法3调用方法1。
public void function1(){
		function2();
}
public void function2(){
		function3();
}
public void function3(){
		function1();
}

注意:

  1. 递归一定要有条件限定用来保证递归能够停止执行,否则会导致栈内存溢出。
  2. 在递归中即使有限定的条件但递归次数还是不能太多。否则同样会导致栈内存溢出。
  3. 构造方法不能递归调用,构造方法是用来创建对象用的,若递归调用,那么堆中就会一直new对象,最终导致堆内存溢出。
  4. 当使用递归方法的时候,方法的主体不变,每次调用方法的参数不同。

(三)、递归案例

1.使用递归计算求和

public static void main(String[] args) {
     int sum = sum(100);
     System.out.println(sum);
 }
 public  static  int sum(int n){
     if(n==0)
         return 0;
     return n+sum(n-1);
 }

在这里插入图片描述

2.使用递归计算正整数的阶乘

public static void main(String[] args) {
     int jc = JC(8);
     System.out.println(jc);
 }
 public static int  JC(int n){
     if(n==1)
         return 1;
     return n*JC(n-1);
 }

在这里插入图片描述

3.使用递归来遍历目录下的所有文件的路径

在这里插入图片描述

 public static void main(String[] args) {
        File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\xiaobei\\iostream\\file");
        printFiles(file);
    }

 public static void printFiles(File file){
     //返回File表示的目录下的目录和文件的对象到File的对象数组中
     File[] files = file.listFiles();
     //进入循环
     for (File file1 : files) {
         if(file1.isFile()){
             //判断file是不是文件,是打印,不是进入递归
             System.out.println(file1.getAbsolutePath());
         }else {
             printFiles(file1);//递归调用本身
         }
         /*反向逻辑
          if (file1.isDirectory()){
              printFiles(file1);;
         }else {
             System.out.println(file1.getAbsolutePath());
         }
          */
     }
 }

在这里插入图片描述



制作不易,各位友友们,大佬们给点鼓励!

点赞👍 收藏+关注 一键三连走起!
在这里插入图片描述

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北慕辰

你的鼓励是小北最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值