学习File和IO流
1.File类的使用
1.1File类概述
1.File类在java.io.File包下
2.File类提供了这些功能:删除、获取文件信息,不能读写文件内容
1.2创建File对象
1.public File(String pathname)根据文件路径创建文件对象
2.public File(String parent, String child)从父路径名和子路径名字符串创建文件对象
3.public File(File parent, String child)根据父路径对应文件对象和子路径名字符串创建文件对象
1.2File类的常用API
1.判断文件类型、获取文件信息
// 创建file文件
File file = new File("src/hello.txt");
// 判断是否是文件 true
System.out.println(file.isFile());
// 判断是否是文件夹 false
System.out.println(file.isDirectory());
// 获取文件名称 hello.txt
System.out.println(file.getName());
// 获取绝对路径 D:\Practical_training\code\test2\test2\src\hello.txt
System.out.println(file.getAbsoluteFile());
// 获取文件字节数 14
System.out.println(file.length());
// 获取文件的最后修改时间 2022-07-21 16:56:34
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified()));
2.创建文件、删除文件
// 如果存在文件则创建失败,如果不存在则创建
try {
new File("src/hh.txt").createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
// 创建一级目录
File file1 = new File("src/aaa");
file1.mkdir();
// 创建多级目录
File file2 = new File("src/aaa/bbb");
file2.mkdirs();
// 删除文件或空文件夹
file1.delete();
file2.delete();
3.遍历文件夹
File src = new File("src");
// 获取一级目录信息
String[] list = src.list();
for (String s : list) {
System.out.println(s);
}
// 获取所有一级文件对象
File[] files = src.listFiles();
for (File file3 : files) {
System.out.println(file3.getAbsoluteFile());
}
}
2.方法递归
2.1递归的形式和特点
形式
1.直接递归
2.间接递归
特点
自己调用自己
2.2递归的算法流程和核心要素
1.入门案例1-n阶乘
public static int f(int n){
if (n == 1){
return 1;
}
return n*f(n-1);
}
2.核心要素
1.递归公式
2.递归终结点
3.递归的方法必须走向终结点
2.3递归的经典问题
猴子吃桃问题
public static int eat(int n){
if (n == 10){
return 1;
}
return 2*eat(n+1)+2;
}
2.4非规律化递归案例-文件搜索
public static void searchFile(File file,String fileName){
// 判断是否是文件夹
if (file != null && file.isDirectory()){
// 提取当前目录下的一级文件对象
File[] files = file.listFiles();
// 判断是否存在一级文件对象
if (files != null && files.length > 0 ){
for (File file1 : files) {
// 如果是自己要找的文件则输出
if (file1.isFile()) {
if (file1.getName().contains(fileName)){
System.out.println(file1.getAbsolutePath());
}
}else {
// 如果不是则继续找
searchFile(file,fileName);
}
}
}
}else {
System.out.println("不是文件夹");
}
}
2.5非规律化递归案例-啤酒问题
public class Recusion_beer {
public static int totalNum;
public static int bottleNUm;
public static int capNUm;
public static void main(String[] args) {
count(10);
System.out.println("啤酒:"+totalNum+", 空瓶:"+bottleNUm+", 盖子:"+capNUm);
}
public static void count(int n){
// 一共可以购买的啤酒
int beer = n/2;
totalNum += beer;
// 获得的盖子和空瓶的总量
int cap = beer+capNUm; //盖子
int bottle = beer+bottleNUm;
// 用盖子和空瓶换酒(此处换算成等量酒的钱)
int money = 0;
if (cap >= 4){
money += (cap/4) * 2;
}
// 剩下的盖子
capNUm = cap%4;
if (bottle >= 2){
money += (bottle/2) * 2;
}
// 剩下的空瓶
bottleNUm = bottle%2; //注意,这里不是+=,因为剩的空瓶已经加上新的空瓶拿来换酒了
if (money>=2){
count(money);
}
}
}
3.字符集
3.1字符串常见的字符底层组成是什么样的
1.英文和数字在任何字符集中都只占一个字节
2.GBK字符中一个中文字符占两个字节
3.utf-8中一个中文一般占三个字节
3.2编码前的字符集和编码好的字符集有什么要求
1.字符集必须一致,不然会乱码
2.英文和数字在任何编码中都不会乱码
3.3字符集的编码和解码
//通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes);
//通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, Charset charset);
//通过使用平台的默认字符集编码字符串,将结果存入一个新的byte数组里面去
byte[] getBytes();
通过指定字符集编码字符串,将结果存入一个新的byte数组里面去
byte[] getBytes(Charset charset);
4.IO流的作用分类
5.字节流和字符流
5.1字节流的使用
5.2资源释放的方式
1.try-catch-finally
2.try-with-source
5.3字符流的使用