学习日记(File 类、方法递归案例、字符集)

学习日记(File 类、方法递归案例、字符集)

一、File 类

  • File 类代表操作系统的文件对象(文件、文件夹)。
  • 提供了如定位文件本身的信息、删除文件、创建文件(文件夹)等功能。
  • 注意 File 类不能读写文件内容

1. 创建 File 对象

  1. 路径的三种写法。

  1. 路径分为绝对路径(从盘符开始)和相对路径(从模块开始)。

  1. 路径可以是文件的路径,也可以是文件夹的路径。

2. 常用 API

包括获取文件信息的 API、创建和删除文件的 API 以及遍历文件夹 API 。

(1)获取文件信息的 API

方法名说明
public String getAbsolutePath()获取绝对路径
public String getPath()获取创建 File 对象时使用的路径
public String getName()获取文件的名称,带后缀
public long length()获取文件的大小,字节大小,返回值类型为 long
public boolean isFile()判断文件是否是文件
public boolean isDirectory()判断文件是否是文件夹
public long lastModified()获取文件的最后修改时间
public boolean exists()判断文件是否存在

示例

运行结果

(2)创建和删除文件的 API

方法名说明
public boolean createNewFile() throws IOException创建新文件,返回值类型为 boolean
public boolean mkdir()创建一级目录,返回值类型为 boolean
public boolean mkdirs()创建多级目录,返回值类型为 boolean
public boolean delete()删除文件或空文件夹,返回值类型为 boolean

注意:delete 方法直接删除,不走回收站

示例

结果

(3)遍历文件夹 API

方法名说明
public File[] listFiles()获取当前目录下所有的一级文件对象到一个文件对象数组中去返回

注意

  • 当调用者(文件路径)不存在时,返回 null;
  • 当调用者是一个文件时,返回 null;
  • 当调用者是一个空文件夹时,返回一个长度为 0 的数组;
  • 当调用者是一个有内容的文件夹时,将里面所有的(一级)文件和文件夹的路径放在 File 数组中返回;
  • 当调用者是一个有隐藏文件的文件夹时,将里面所有的文件和文件夹的路径放在 File 数组中返回,包含隐藏内容;
  • 当调用者是一个需要权限才能进入的文件夹时,返回 null。

3. 文件搜索

需求:文件搜索,从 E 盘中,找到某个文件名称,如:WeChat.exe,并输出绝对路径。

分析

  • 先定位出一级对象;
  • 遍历全部一级对象,判断是否是文件;
  • 如果是文件,判断是否是自己想要的;如果是文件夹,则需要继续递归重复上述过程。

package com.residue.File;

import java.io.File;

public class FileDemo06 {

    public static void main(String[] args) {

        //需求:文件搜索,从 E 盘中,找到某个文件名称,如:`WeChat.exe`,并输出绝对路径。
        searchFile(new File("E:\\"), "WeChat.exe");

    }

    public static void searchFile(File file, String name) {

        //判断文件是否为 null
        if (file != null) {
            //将一级目录文件存放到 File 数组中
            File[] files = file.listFiles();
            //如果 file 是一个文件,则 files 为 null;如果 file 是一个空文件夹时,
            //则 files 的长度为 0,排除上面两种情况
            if (files != null && files.length > 0) {
                //此时 file 是一个文件夹,遍历文件夹
                for (File f : files) {
                    //如果 f 是一个文件,判断是否是目标文件
                    if (f.isFile() && f.getName().contains(name)) {
                        System.out.println("文件已找到!文件的路径为:" + f.getAbsolutePath());
                        //启动!
                        try {
                            Runtime r = Runtime.getRuntime();
                            r.exec(f.getAbsolutePath());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        //如果是文件夹,方法递归
                        searchFile(f, name);
                    }
                }
            } else if (file.isFile() && file.getName().contains(name)) {
                System.out.println("文件已找到!文件的路径为:" + file.getAbsolutePath());
            }

        } else {
            System.out.println("输入的不是文件!");
        }
    }
}

二、方法递归

递归要素:递归头(终结点)、递归体(递推公式)、递归的方向必须走向终结点。

1. 规律化递归

需求 1:计算 1-n 的阶乘。

需求 2:计算 1-n 的和。

需求 3:猴子吃桃子,第一天摘了若干个桃子,第二天吃了一半多一个,第三天又吃了第二天剩余的一半多一个,到第十天的时候发现桃子只有 1 个了,求原先摘了多少个桃子。

在这里插入图片描述

2. 非规律化递归

  • 文件搜索:见 File 类内容 3。
  • 啤酒问题

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

package com.residue.recursion;

public class RecursionDemo04 {

    public static int allBeer = 0;       //总共喝了的啤酒
    public static int lastBottle = 0;    //剩余的瓶子
    public static int lastCap = 0;       //剩余的盖子

    public static void main(String[] args) {

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

        money(10);
        System.out.println(allBeer);
        System.out.println(lastBottle);
        System.out.println(lastCap);

    }


    public static void money(int x) {
        //计算用钱一次可以最多买多少瓶啤酒
        allBeer = allBeer + x / 2;

        lastBottle = lastBottle + x / 2;
        lastCap = lastCap + x / 2;

        int mon = 0;
        if (lastBottle >= 2) {
            //开始用空瓶换啤酒
            mon += (lastBottle / 2) * 2;   //算相当于多少钱,2 个空瓶相当于 1 瓶,相当于 2 元
            lastBottle = lastBottle % 2;  //计算换完啤酒后(还没喝),剩余的瓶子
        }

        if (lastCap >= 4) {
            mon += (lastCap / 4) * 2;
            lastCap = lastCap % 4;
        }

        if (mon >= 2) {
            money(mon);
        }

    }
}

三、字符集

1. 概述

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

常见的字符集有:ASCII 字符集、GBK 字符集、Unicode 字符集。

字符串常见的字符底层组成

  • 英文和数字在任何国家的字符集都占 1 个字节。
  • GBK 字符集中一个中文字符占 2 个字节。
  • UTF-8 编码中一个中文一般占 3 个字节。
  • 编码前和编码后的字符集必须一致,否则会出现中文字符乱码。
  • 英文和数字在任何国家的编码中都不会乱码,因为都兼容 ASCII 码表。

2. 字符集的编码、解码操作

编码(字符串 -> 字节数组)的方法(调用字符串的方法):

  • 默认:byte[] bytes1 = str.getBytes();

  • 指定:byte[] bytes2 = str.getBytes("GBK");

解码(字节数组 -> 字符串)的方法(使用构造器):

  • 默认:String result1 = new String(bytes1);
  • 指定:String result2 = new String(bytes2, "GBK");

注意:编码前和编码后的字符集必须一致,否则会出现中文字符乱码。


注意:

  1. 当文件路径不存在或者文件是文件夹时,此时调用 length 方法结果为 0。文件不存在,输出不是 null 。

  1. 字符串和字节数组的相互转化用上面编解码的方法,单个字符与字节的相互转化用类型转换
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sun 3285

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

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

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

打赏作者

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

抵扣说明:

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

余额充值