File类、递归

一、File 类的使用

  • java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。
  • File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。 如果需要访问文件内容本身,则需要使用输入/输出流。
  • 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
  • File对象可以作为参数传递给流的构造器。

1.1 常用构造器

 1.1.1 绝对路径 vs 相对路径

  • public File(String pathname)    以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
        绝对路径:是一个固定的路径, 从盘符开始。
        相对路径:是相对于某个位置开始。
  • public File(String parent,String child)    以parent为父路径,child为子路径创建File对象。
  • public File(File parent,String child)    根据一个父File对象和子文件路径创建File对象。
package com.hp.test3;

import java.io.File;

public class FileTest01 {
    public static void main(String[] args) {
        //File对象就表示一个路径,可以是文件的路径、也可以是文件夹的路径
        //这个路径可以是存在的,也允许是不存在的

        /**
         * public File(string pathname)    根据文件路径创建文件对象
         * public File(string parent,string child)    根据父路径名字符串和子路径名字符串创建文件对象
         * public File(File parent,String child)  根据父路径对应文件对象和子路径名字符串创建文件对象
         *
         * "C:\Users\chenge\Desktop\work\a.txt"
         * \:转义字符
         * \\:分隔符
         * window:\
         *
         */

        //1.根据字符串路径创建File对象
        String str = "C:\\Users\\chenge\\Desktop\\work\\a.txt";
        File f1 = new File(str);
        System.out.println(f1);

        //2.父路径:C:\Users\chenge\Desktop\work\
        //子路径:a.txt

        String s1 = "C:\\Users\\chenge\\Desktop\\work";
        String s2 = "a.txt";
        File f2 = new File(s1,s2);
        System.out.println(f2);

        //3.把一个File对象和一个String字符串进行拼接
        File f3 = new File("C:\\Users\\chenge\\Desktop\\work");
        String s3 = "a.txt";
        File f4 = new File(f3,s3);
        System.out.println(f4);

    }
}

运行结果:  

1.2 路径分隔符

  • 路径中的每级目录之间用一个路径分隔符隔开。
  • 路径分隔符和系统有关:
  •         windows和DOS系统默认使用"\"来表示。
  •         UNIX和URL使用"/"来表示。
  • Java程序支持跨平台运行,因此路径分隔符要慎用。
  • 为了解决这个隐患,File类提供了一个常量:public static final String separator。根据操作系统,动态的提供分隔符。
  • 举例:

File f3 = new File("C:\\Users\\chenge\\Desktop\\work");

1.3 常用方法

package com.hp.test3;

import java.io.File;

public class FileTest03 {
    public static void main(String[] args) {
        /**
         * public long length()      返回文件的大小(字节数量)
         * public String getAbsolutePath()         返回文件的绝对路径
         * public String getPath()       返回定义文件时使用的路径
         * public String getName()     返回文件的名称,带后缀
         * public long lastModified()      返回文件的最后修改时间(时间毫秒值)
         *
         */


        //1.length   返回文件的大小(字节数量)
        //细节1: 这个方法只能获取文件的大小,单位是字节
        // 如果单位我们要是M,G,可以不断的除以1024
        // 细节2: 这个方法无法获取文件夹的大小
        // 如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小都累加在一起。
        File f1 = new File("C:\\Users\\chenge\\Desktop\\work\\a.txt");
        long l1 = f1.length();
        System.out.println(l1);//6

        File f2 = new File("C:\\Users\\chenge\\Desktop\\work\\bbb");
        long l2 = f2.length();
        System.out.println(l2);//0
        System.out.println("==========================");

        //2.getAbsolutePath  返回文件的绝对路径
        File f3 = new File("C:\\Users\\chenge\\Desktop\\work\\a.txt");
        String path1 = f3.getAbsolutePath();
        System.out.println(path1);//C:\Users\chenge\Desktop\work\a.txt

        File f4 = new File("Day11-28\\a.txt");
        String path2 = f4.getAbsolutePath();
        System.out.println(path2);//D:\Software\Software IDEA\Demo\a.txt
        System.out.println("==============================");

        //3.getPath  返回定义文件时使用的路径
        File f5 = new File("C:\\Users\\chenge\\Desktop\\work\\a.txt");
        String path3 = f5.getPath();
        System.out.println(path3);//C:\Users\chenge\Desktop\work\a.txt

        File f6 = new File("Day11-28\\a.txt");
        String path4 = f6.getPath();
        System.out.println(path4);//Day11-28\a.txt
        System.out.println("=========================");

        //4.getName 获取名字
        //细节1:
        //a.txt:
        //  a 文件名
        //  txt 后缀名、扩展名
        //细节2:
        //文件夹: 返回的就是文件夹的名字
        File f7 = new File( "C:\\Users\\chenge\\Desktop\\work\\a.txt");
        String name1 = f7.getName();
        System.out.println(name1);//a.txt

        File f8 = new File( "C:\\Users\\chenge\\Desktop\\work\\bbb");
        String name2 = f8.getName();
        System.out.println(name2);//bbb
        System.out.println("==============================");

        //5.lastModified 返回文件的最后修改时间(时间毫秒值)
        File f9 = new File("C:\\Users\\chenge\\Desktop\\work\\a.txt");
        long l3 = f9.lastModified();
        System.out.println(l3);

    }
}

运行结果: 

1.4

 

package com.hp.test3;

import java.io.File;

public class FileTest02 {
    public static void main(String[] args) {
        /**
         * 返回布尔类型
         * public boolean isDirectory()判断此路径名表示的File是否为文件夹
         *  public boolean isFile()判断此路径名表示的File是否为文件
         *   public boolean exists()判断此路径名表示的File是否存在
         */


        //1.对一个文件的路径进行判断
        File f1 = new File("C:\\Users\\chenge\\Desktop\\work\\a.txt");
        System.out.println(f1.isDirectory());//false
        System.out.println(f1.isFile());//true
        System.out.println(f1.exists());//true

        System.out.println("--------------------------------");

        //2.对一个文件夹的路径进行判断
        File f2 = new File("C:\\Users\\chenge\\Desktop\\work\\bbb");
        System.out.println(f2.isDirectory());//true
        System.out.println(f2.isFile());//false
        System.out.println(f2.exists());//true

        System.out.println("----------------------");

        //1.对一个不存在的路径进行判断
        File f3 = new File("C:\\Users\\chenge\\Desktop\\work\\b.txt");
        System.out.println(f3.isDirectory());//false
        System.out.println(f3.isFile());//false
        System.out.println(f3.exists());//false
    }
}

运行结果: 

 

package com.hp.test3;

import java.io.File;
import java.io.IOException;

public class FileTest04 {
    public static void main(String[] args) throws IOException {
        /**
         * public boolean createNewFile()  创建一个新的空的文件
         * public boolean mkdir()  创建单级文件夹
         * public boolean mkdirs()  创建多级文件夹
         * public boolean delete()  删除文件、空文件夹
         *
         */

        //1.createNewFile 创建一个新的空的文件
        //细节1: 如果当前路径表示的文件是不存在的,则创建成功,方法返回true
        //      如果当前路径表示的文件是存在的,则创建失败,方法返回false
        //细节2: 如果父级路径是不存在的,那么方法会有异常IOException
        //细节3:createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件
        File f1 = new File("C:\\Users\\chenge\\Desktop\\work\\b.txt");
        boolean b1 = f1.createNewFile();
        System.out.println(b1);

        //2.mkdir  创建单级文件夹 make Directory,文件夹(目录)
        //细节1: windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
        // 细节2: mkdir方法只能创建单级文件夹,无法创建多级文件夹。
        File f2 = new File("C:\\Users\\chenge\\Desktop\\work\\ddd");
        boolean b2 = f2.mkdir();
        System.out.println(b2);

        //3.mkdirs   创建多级文件夹
        //细节: 既可以创建单级的,又可以创建多级的文件夹
        File f3 = new File("C:\\Users\\chenge\\Desktop\\work\\ccc\\aaa\\cg");
        boolean b3 = f3.mkdirs();
        System.out.println(b3);


    }
}
package com.hp.test3;

import java.io.File;

public class FileTest05 {
    public static void main(String[] args) {
        //delete 删除文件、空文件夹
        //细节:
        //如果删除的是文件,则直接删除,不走回收站。
        // 如果删除的是空文件夹,则直接删除,不走回收站
        // 如果删除的是有内容的文件夹,则删除失败

        File f1 = new File("C:\\Users\\chenge\\Desktop\\work\\c.txt");
        boolean d = f1.delete();
        System.out.println(d);

    }
}

我们只用掌握这些方法是怎么用的就行。

1.4 目录的遍历

  • public string[] ist() : 返回一个String数组,表示该File目录中的所有子文件或目录
  • public File[] listFiles() : 返回一个File数组,表示该File目录中的所有的子文件或目录
package com.hp;

import java.io.File;
import java.util.Arrays;

public class FileTest01 {
    public static void main(String[] args) {
        File f1=new File( "C:\\Users\\chenge\\Desktop\\work");
        String[] list = f1.list(); //获取文件夹中所有的 子目录 或 文件 的名字数组
        System.out.println(Arrays.toString(list));

        File[] files = f1.listFiles(); 获取文件夹中所有的 子目录 或 文件 的FiLe对象数组
        System.out.println(Arrays.toString(files));

        for (int i = 0; i < files.length; i++) {
            File temp = files[i];
            if (temp.isDirectory()) {
                File[] files1 = temp.listFiles();
                System.out.println(Arrays.toString(files1));
            }
        }
    }
}

运行结果:

这种方法只能获取少量的多级文件夹,如果多级文件夹套的多了我们就要使用递归了。

1.5 递归

递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。也就是说,递归算法是一种直接或者间接调用自身方法的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。

注意:递归必须要有一个退出的条件!

 递归算法解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。

其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。

package com.hp;

public class DiGui {

    public static void main(String[] args) {

        //递归----复杂算法
        System.out.println("-----1------");
        System.out.println("-----2------");
        int count= 0;
        fun(count);
        System.out.println("-----3------");
        System.out.println("-----4------");
    }

    //方法中自己调用自己叫做递归  递(有条件的递)  归(某个时刻不在调用自己,进行方法返回)
    public static void  fun(int count){
        count++;
        System.out.println("-----1.1------");
        System.out.println("-----2.2------");
        if (count<3){
            fun(count);
        }
        System.out.println("-----3.3------");
        System.out.println("-----4.4------");
    }
}

运行结果:

    递归实现打印输出1-n 
先虚构方法可以完成什么事,把核心业务写出来,在分析后续的规律
package com.hp;

public class DiGuiTest {
    public static void main(String[] args) {
        print(10);

        int he = sam(2);
        System.out.println(he);
    }
    /**
     * 递归实现打印输出1-n   先虚构方法可以完成什么事,把核心业务写出来,在分析后续的规律
     */
    public static void print(int n){
        System.out.println(n);//n
        if (n>0){
            print(n-1);//1 - (n-1)
        }
    }
    public  static  int  sam(int n){
        int sum=0;
        sum=sum+n;//累加n
        if (n>0){
            sum=sum+sam(n-1);//累加1-(n-1)
        }
    return sum;
    }

}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃汉堡的代码人

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值