JAVA: File类、Recursion(方法递归)及其经典案例:啤酒问题、Charset(字符集/编码表)

1.File类

1.1 File类概述

1.2 File类创建对象

File其实是现实生活中真实存在的文件(或文件夹)对象,File类就是文件(文件夹)对象共同特征的描述。因此我们可以创建File对象并使用。

补充:相对路径和绝对路径

根据上表我们可以看出File类创建对象时,需要文件(文件夹)的路径。因此我们在这里引入一个新的概念:相对路径和绝对路径

获取一个文件的绝对路径很简单,那么该怎么获取相对路径呢?这里我使用的工具是IDEA。

  1. 在IDEA主界面选择如下选项:

2.如下,查看Working directrory(工作目录)里的路径:

  1. 在绝对路径中将"Working directory"的路径换成" . "即可。

总结一下

1.3 File类API

1.3.1 判断文件类型、获取文件信息

实例:

File f1=new File("D:/JavaPoint/Fighting.jpg");
    System.out.println(f1.getAbsoluteFile());//1.获取绝对路径
    System.out.println(f1.getPath());//2.获取定义文件时所使用的路径
    System.out.println(f1.getName());//3.获取文件的名称,带后缀
    System.out.println(f1.length());//4.获取文件的大小(字节个数)

    long time=f1.lastModified();    //5.获取文件的最后修改时间
    System.out.println("最后修改时间为:"+new SimpleDateFormat("yyyy/MM/dd HH/mm/ss").format(time));

    System.out.println(f1.isFile()); //6.判断文件是文件还是文件夹
    System.out.println(f1.isDirectory());
    System.out.println("-----------------");

File f2=new File(".\\Phase2\\resource\\data01.txt");//相对路径
    System.out.println(f2.getPath());//上一行是相对路径,因此这里得到相对路径
    System.out.println(f2.getAbsoluteFile());//得到绝对路径
    System.out.println("------------------");

File f3=new File("D:/");
    System.out.println(f3.isFile());
    System.out.println(f3.isDirectory());

1.3.2 创建或删除文件

实例:File类的增删API都返回boolean值。

File f1=new File("./Phase2/resource/data02.txt");//1.createNewFile 创建新文件
    System.out.println(f1.createNewFile());//几乎不用,因为以后文件都是自动创建的

File f2=new File("D:/JavaPoint/level");
    System.out.println(f2.mkdir()); //2.mkdir 创建单级目录
    File f3=new File("D:/JavaPoint/level1/level2/level3");
    System.out.println(f3.mkdirs()); //3.mdkirs 创建多级目录(!!!!)
        //不能创建已有的文件夹,因此只要跑一次,以后就会返回false

System.out.println(f1.delete());//先把f1创建的新文件删除
File f4=new File("D:/JavaPoint/level");//4.delete 删除文件(被占用也能删掉)
                             //5.delete 删除 空文件夹(为了安全,非空文件夹不能删)

1.3.3 File类遍历

实例:

File f5=new File("D:/JavaPoint");
    String[] names=f5.list();//1.list 返回当前目录下所有的“一级文件名称”;
    for (String name : names) {
        System.out.println(name);
    }

File f6=new File("D:/JavaPoint/level1");
    //2.listFiles 返回当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(!!!!!)
    File[] files=f6.listFiles();
    for (File f : files) {
        System.out.println(f6.getAbsolutePath());
    }
/* listFiles注意事项:
*    1.当调用者不存在  或  是一个文件时,返回null
*    2.当调用者是一个空文件夹时,返回一个长度为0的数组(记得使用Arrays.toString)*/

2.方法递归

2.1 方法递归概述

2.1.1 方法递归死循环

当递归没有控制好终止后,就会出现死循环:会导致栈内存溢出。如下:

2.2 方法递归三要素

三要素是解决递归问题的基本思路:

2.3 啤酒问题

啤酒2元1瓶,4个瓶盖或者2个空瓶能换1瓶啤酒。求10元能喝多少瓶啤酒,剩余多少盖子和空瓶?

public static void main(String[] args) {
    buy(10);
    System.out.println("总啤酒数:"+totalNumber);
    System.out.println("空瓶数:"+lastBottlelNumber);
    System.out.println("盖子数:"+lastCoverlNumber);
}
/*把每次喝酒看成一轮,每次换就开始下一轮,知道不能换为止*/
public static int totalNumber;      //总啤酒数量
public static int lastBottlelNumber;//每轮剩余的空瓶个数(默认值为0)
public static int lastCoverlNumber;//每轮剩余的盖子个数(默认值为0)

public static void buy(int money) {
    int buyNumber = money / 2;  //buyNumber:买啤酒的瓶数
    totalNumber += buyNumber;    //从把第二轮开始的换酒也看成买酒

/*本轮的总空瓶数就等于上轮空瓶数加上这轮*/
int bottleNumber = lastBottlelNumber + buyNumber;
int coverNumber = lastCoverlNumber + buyNumber;

int changeMoney = 0;      //把能换啤酒的空瓶和盖子换算成钱
        
/*一个空瓶相当于一块钱,这轮的新空瓶数就是上轮的空瓶数[取余2]得到的*/
if (bottleNumber >= 2) {
    changeMoney += (bottleNumber / 2) * 2;
}
lastBottlelNumber = bottleNumber % 2;
        
/*盖子同理*/
if (coverNumber >= 4) {
changeMoney += (coverNumber / 4) * 2;
}
lastCoverlNumber = coverNumber % 4;
    
if (changeMoney >= 2) {    //钱数能换酒瓶时就换
    buy(changeMoney);
}

3. 字符集(编码表)

学习完File类,在学习IO流之前,我们来了解一下字符集

3.1 了解字符集

字符集:就是一种编码规范,使用不同的二进制数来表示代表不同的字符,这样电脑就可以根据二进制数来显示其对应的字符。我们通常就称呼其为XX编码,XX字符集。

3.2 字符集的种类

3.2.1 ASCLL码表

3.2.2 GBK(中国的码表)

3.3.3 Unicode

注意:GBK和Unicode都是兼容ASCLL码表的。其中我们最常用的就是Unicode中的UTF-8字符集。

3.3 编码和解码

3.3.1 了解编码和解码

我们先来看一下汉字的编码、解码过程:

3.3.2 String编解码API

字符串编解码:

实例:

public static void main(String[] args) throws UnsupportedEncodingException {    //抛出异常
/* 1.编码:把文字转换成字节(使用特定的编码)*/
    String name="abc我爱你中国";

   //byte[] bytes=name.getBytes();    //以当前代码的默认字符集进行编码(UTF-8)
     byte[] bytes=name.getBytes("GBK");       //指定字符集1编码
     System.out.println(bytes.length);
     System.out.println(Arrays.toString(bytes));

/* 2.解码:把字符集转换成相对应的中文形式(编码前后的字符集必须一致,否则乱码!!!)          */
    //String rs=new String(bytes);//按默认的UTF-8字符集进行解码
     String rs=new String(bytes,"GBK");//按默认的UTF-8字符集进行解码
     System.out.println(rs);
}

运行结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值