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

文章目录

  • 学习日记(File 类、方法递归案例、字符集)
  • 一、File 类
    • 1. 创建 File 对象
    • 2. 常用 API
      • (1)获取文件信息的 API
      • (2)创建和删除文件的 API
      • (3)遍历文件夹 API
    • 3. 文件搜索
  • 二、方法递归
    • 1. 规律化递归
    • 2. 非规律化递归
  • 三、字符集
    • 1. 概述
    • 2. 字符集的编码、解码操作
  • 注意:

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

一、File 类

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

1. 创建 File 对象

  1. 路径的三种写法。

学习日记(File 类、方法递归案例、字符集)_第1张图片

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

学习日记(File 类、方法递归案例、字符集)_第2张图片

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

学习日记(File 类、方法递归案例、字符集)_第3张图片

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() 判断文件是否存在

示例

学习日记(File 类、方法递归案例、字符集)_第4张图片

学习日记(File 类、方法递归案例、字符集)_第5张图片

运行结果

学习日记(File 类、方法递归案例、字符集)_第6张图片

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

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

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

示例

学习日记(File 类、方法递归案例、字符集)_第7张图片

学习日记(File 类、方法递归案例、字符集)_第8张图片

结果

学习日记(File 类、方法递归案例、字符集)_第9张图片

学习日记(File 类、方法递归案例、字符集)_第10张图片

(3)遍历文件夹 API

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

注意

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

学习日记(File 类、方法递归案例、字符集)_第11张图片

3. 文件搜索

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

分析

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

学习日记(File 类、方法递归案例、字符集)_第12张图片

学习日记(File 类、方法递归案例、字符集)_第13张图片

学习日记(File 类、方法递归案例、字符集)_第14张图片

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 的阶乘。

学习日记(File 类、方法递归案例、字符集)_第15张图片

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

学习日记(File 类、方法递归案例、字符集)_第16张图片

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

学习日记(File 类、方法递归案例、字符集)_第17张图片

2. 非规律化递归

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

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

学习日记(File 类、方法递归案例、字符集)_第18张图片

学习日记(File 类、方法递归案例、字符集)_第19张图片

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");

学习日记(File 类、方法递归案例、字符集)_第20张图片

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

学习日记(File 类、方法递归案例、字符集)_第21张图片


注意:

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

学习日记(File 类、方法递归案例、字符集)_第22张图片

  1. 字符串和字节数组的相互转化用上面编解码的方法,单个字符与字节的相互转化用类型转换

你可能感兴趣的:(#,JavaSE,学习,java,后端,1024程序员节)