笔记九:File类和方法递归


File类

  • File类的对象代表操作系统的文件(文件、文件夹),File类在java.io.File包下
  • File类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功能

File类创建对象

方法名称 说明
public File(String pathname) 根据文件路径创建文件对象
public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象
public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象

绝对路径和相对路径

  • 绝对路径:从盘符开始,如File file1 = new File(“D:\\study\\a.txt”);

  • 相对路径:不带盘符,默认直接到当前工程下的目录寻找文件,如File file3 = new File(“模块名\\a.txt”);

File类的判断文件类型、获取文件信息功能

方法名称 说明
public boolean isDirectory() 判断此路径名表示的File是否为文件夹
public boolean isFile() 判断此路径名表示的File是否为文件
public boolean exists() 判断此路径名表示的File是否存在
public long length() 返回文件的大小(字节数量)
public String getAbsolutePath() 返回文件的绝对路径
public String getPath() 返回定义文件时使用的路径
public String getName() 返回文件的名称,带后缀
public long lastModified() 返回文件的最后修改时间(时间毫秒值)

File类创建文件的功能

方法名称 说明
public boolean createNewFile() 创建一个新的空的文件
public boolean mkdir() 只能创建一级文件夹
public boolean mkdirs() 可以创建多级文件夹

File类删除文件的功能

方法名称 说明
public boolean delete() 删除由此抽象路径名表示的文件或空文件夹

注意:delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站

File类的遍历功能

方法名称 说明
public String[] list() 获取当前目录下所有的“一级文件名称”到一个字符串数组中去返回。
public File[] listFiles()(常用) 获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点)

listFiles方法注意事项:

  • 当文件不存在时或者代表文件时,返回null

  • 当文件对象代表一个空文件夹时,返回一个长度为0的数组

  • 当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回

  • 当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件

  • 当没有权限访问该文件夹时,返回null

方法递归

定义:方法调用自身的形式称为递归(recursion),递归做为一种算法在程序设计语言中广泛应用

形式

  • 直接递归:方法自己调用自己
  • 间接递归:方法调用其他方法,其他方法又回调方法自己

存在的问题:递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象

案例1:递归求1-n的和

public static int f(int n) {
    if(n == 1){
    	return 1;
    }else{
    	return n + f(n-1);
    }
}

案例2:文件搜索

需求:从某路径下搜索出某个文件名称并输出绝对路径

public static void searchFile(File dir, String fileName){
    // 3、判断dir是否为目录
    if(dir != null && dir.isDirectory()){
        // 4、提取当前目录下的一级文件对象
        File[] files = dir.listFiles(); //null []
        // 5、判断一级文件夹是否存在
        if(files !=null && files.length > 0){
            for (File file : files) {
                // 6、判断当前遍历的一级文件对象是文件还是目录
                if(file.isFile()){
                    // 7、是不是要找的,是把其路径输出
                    if(file.getName().contains(fileName)){
                        System.out.println("找到了:" + file.getAbsolutePath());
                    }
                }else{
                    // 8、是文件夹,需要继续递归寻找
                    searchFile(file, fileName);
                }
            }
        }
    }else{
        System.out.println("对不起,当前搜索的位置不是文件夹!");
    }
}

案例3:啤酒问题

需求:啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元钱可以喝多少瓶酒,剩余多少空瓶和盖子。

public class Test3 {

    // 定义一个静态的成员变量用于存储可以买的酒数量
    public static int totalNumber;           // 总数量
    public static int lastBottleNumber;      // 记录每次剩余的瓶子个数
    public static int lastCoverNumber;       // 记录每次剩余的盖子个数

    public static void main(String[] args) {
        // 1、拿钱买酒
        buy(10);
        System.out.println("总数:" + totalNumber);
        System.out.println("剩余盖子数:" + lastCoverNumber);
        System.out.println("剩余瓶子数:" + lastBottleNumber);
    }

    public static void buy(int money){
        // 2、看可以立马买多少瓶
        int buyNumber = money / 2;  // 5
        totalNumber += buyNumber;

        // 3、把盖子和瓶子换成钱
        // 统计本轮总的盖子数和瓶子数
        int coverNumber = lastCoverNumber + buyNumber;
        int bottleNumber = lastBottleNumber + buyNumber;

        // 4、更新每次剩余的盖子数和瓶子数
        lastCoverNumber = coverNumber % 4;
        lastBottleNumber = bottleNumber % 2;

        // 5、判断是否够换成钱
        if(coverNumber / 4 != 0 || bottleNumber / 2 != 0){
            // 够,计算出能换成多少钱,并重新迭代
            int allMoney = (coverNumber / 4 + bottleNumber / 2) * 2;
            buy(allMoney);

        }
    }
}

字符集

  • 计算机底层不可以直接存储字符的,计算机底层只能存储二进制

  • 计算机可以给人类字符进行编号存储,这套编号规则就是字符集

  • 字符集(Character Set)是多个字符的集合

  • 常见字符集有ASCII字符集、GBK字符集以及Unicode(UTF-8)字符集等

ASCII字符集

  • ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):包括了数字、英文、符号
  • ASCII使用一个字节存储一个字符,一个字节是8位,总共可以表示128个字符信息,对于表示英文、数字来说是够用

GBK

  • GBK是中国的码表,包含了几万个汉字等字符,同时也要兼容ASCII编码

  • GBK编码中一个中文字符一般以两个字节的形式存储

Unicode字符集

  • 统一码,也叫万国码。是计算机科学领域里的一项业界标准

  • UTF-8是Unicode的一种常见编码方式,一般以三个字节的形式存储,同时也要兼容ASCII编码表,英文和数字在任何国家的编码中都不会乱码

注意:技术人员都应该使用UTF-8的字符集编码,编码器前和编码后的字符集要一致,否则会出现中文乱码。

String编码

方法名称 说明
byte[] getBytes() 使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName) 使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中

String解码

构造器 说明
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName) 通过指定的字符集解码指定的字节数组来构造新的 String

文章作者: 不才叶某
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不才叶某 !
评论
  目录