1.File类
1.1 File类概述
![](https://img-blog.csdnimg.cn/img_convert/aa135cdb556b3903ce75b8ed10b6a478.png)
1.2 File类创建对象
File其实是现实生活中真实存在的文件(或文件夹)对象,File类就是文件(文件夹)对象共同特征的描述。因此我们可以创建File对象并使用。
![](https://img-blog.csdnimg.cn/img_convert/338857edfea473a5f83e14378bfd1096.png)
补充:相对路径和绝对路径
根据上表我们可以看出File类创建对象时,需要文件(文件夹)的路径。因此我们在这里引入一个新的概念:相对路径和绝对路径。
![](https://img-blog.csdnimg.cn/img_convert/71cfd8f2f24cfad2d4c40cfa7c69b904.png)
获取一个文件的绝对路径很简单,那么该怎么获取相对路径呢?这里我使用的工具是IDEA。
在IDEA主界面选择如下选项:
![](https://img-blog.csdnimg.cn/img_convert/fec03438aef5fa69199f5dc78ec7bcc9.png)
2.如下,查看Working directrory(工作目录)里的路径:
![](https://img-blog.csdnimg.cn/img_convert/8a3985e0511fc426cf941351b52c5f79.png)
在绝对路径中将"Working directory"的路径换成" . "即可。
总结一下:
![](https://img-blog.csdnimg.cn/img_convert/57ca4339f010aa2883cc3b41faabfb6a.png)
1.3 File类API
1.3.1 判断文件类型、获取文件信息
![](https://img-blog.csdnimg.cn/img_convert/4416bea74e935dba0ea5588432bacde9.png)
实例:
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 创建或删除文件
![](https://img-blog.csdnimg.cn/img_convert/6cfe5ede860c10fe71c2cb6f75cd3036.png)
实例: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类遍历
![](https://img-blog.csdnimg.cn/img_convert/953ab0169aca6e0c7108d34fcd4b95d2.png)
实例:
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 方法递归概述
![](https://img-blog.csdnimg.cn/img_convert/0fbe7328bf50c7a30baeef25aba473c5.png)
2.1.1 方法递归死循环
当递归没有控制好终止后,就会出现死循环:会导致栈内存溢出。如下:
![](https://img-blog.csdnimg.cn/img_convert/955a41ca75065e645446b8dd394c7557.png)
2.2 方法递归三要素
这三要素是解决递归问题的基本思路:
![](https://img-blog.csdnimg.cn/img_convert/4f2ef61f1c693be51b629fcfd0d2369a.png)
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字符集。
![](https://img-blog.csdnimg.cn/img_convert/d11b58ac3579855b3df26d34d57819c8.png)
3.2 字符集的种类
3.2.1 ASCLL码表
![](https://img-blog.csdnimg.cn/img_convert/799f78b31a0daacce62b47ed3adc8509.png)
3.2.2 GBK(中国的码表)
![](https://img-blog.csdnimg.cn/img_convert/00e869ffc6c055f7ebebe8cab62999bd.png)
3.3.3 Unicode
![](https://img-blog.csdnimg.cn/img_convert/7405849804e3da9640a0167c7ea5cce4.png)
注意:GBK和Unicode都是兼容ASCLL码表的。其中我们最常用的就是Unicode中的UTF-8字符集。
3.3 编码和解码
3.3.1 了解编码和解码
我们先来看一下汉字的编码、解码过程:
![](https://img-blog.csdnimg.cn/img_convert/2c4827320467282871c936eeb9cbd716.png)
![](https://img-blog.csdnimg.cn/img_convert/38ef0bfb27af4ba0fdd5dfbd98cfbffe.png)
3.3.2 String编解码API
字符串编解码:
![](https://img-blog.csdnimg.cn/img_convert/078a0d3b74ef000851480cbe334c7a5d.png)
实例:
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);
}
运行结果如下:
![](https://img-blog.csdnimg.cn/img_convert/bf41d728aeb291133f897635cb0fdd42.png)