File
概述
java.io.File
类是文件和文件夹路径名的表示形式,主要用于文件和目录的创建、查找和删除等操作。
构造方法
- public File(String pathname):通过指定的字符串转换抽象路径名来创建新的File对象
- public File(String parent, String child):将父类的字符串路径名和子类的字符串路径名合并,并创建新的File实例
- public File(File parent, String child):从父抽象路径名和子路径的字符串合并,创建新的File实例
对绝和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径
- 相对路径:相对于项目的路径,这是一个便捷的路径,开发中经常使用。
常用方法
-
获取功能的方法
- public String getAbsolutePath():返回此File的绝对路径名字字符串
- public String getPath():将此File转换成路径字符串。可以获取构造方法的字符串
- public String getName():返回此File表示的文件或者目录名称
- public long length():返回由此File表示的文件的长度,只能获取文件的字节个数,不能获取文件夹
-
创建和删除功能的方法:
- public boolean CreateNewFile():当创建此名称文件不存在,会自动创建一个新的空文件
- public boolean mkdir():创建新的目录(单级文件夹)
- public boolean mkdirs():创建新的目录包括不存在的父级目录(多级文件夹)
- public Boolean delete():删除文件或目录(1.回收站找不到; 2.删除任何文件都可以,不能删除空的文件夹)
-
判断功能的方法:
- public boolean existe():此方法表示文件或者目录是否实际存在
- public boolean isDirectory():此方法表示的是否为目录
- public boolean isFile():此方法表示的是否为文件
目录遍历
- public String[] list() :返回一个String数组,表示该File目录中所有的子文件或者目录
- public File[] listFiles() : 返回一个File数组,表示该File目录中的所有子文件或目录
- public File[] listFiles(FileFilter filter):将文件夹中的每一个文件和文件夹,放到FileFilter中accept方法的参数中,调用accept方法满足过滤器指定条件,代表accept方法返回的是true
递归
概述:指在当前方法内调用自己的这种现象。
格式:
递归求和
public class DiGuiDemo {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int num = 5;
// 调用求和的方法
int sum = getSum(num);
// 输出结果
System.out.println(sum);
}
/*
通过递归算法实现.
参数列表:int
返回值类型: int
*/
public static int getSum(int num) {
/*
num为1时,方法返回1,
相当于是方法的出口,num总有是1的情况
*/
if(num == 1){
return 1;
}
/*
num不为1时,方法返回 num +(num-1)的累和
递归调用getSum方法
*/
return num + getSum(num-1);
}
}
递归阶乘
/*
5! : 5的阶乘
5! = 5 * 4 * 3 * 2 * 1
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1! = 1
n! = n * (n-1)!
(byte) 130 = -126
*/
public class Demo02 {
public static void main(String[] args) {
System.out.println(fun(5));
System.out.println(fun(6));
System.out.println(fun(7));
System.out.println(fun(8));
System.out.println(fun(3000));
}
/**
* 此方法用来求n的阶乘
* <p>
* 我们在写递归方法的时候, 不要想好多层
* 只需要写好一层就可以了
*/
public static int fun(int n) {
// 出口
if (n == 1) {
return 1;
}
// n! = n * (n-1)!
return n * fun(n - 1);
}
}
文件搜索
/**
* 打印文件夹中所有文件, 包含文件夹中的文件
*/
public class Demo03 {
public static void main(String[] args) {
printFile(new File("C:\\"));
}
/**
* 此方法用于打印文件夹中的所有文件
*/
public static void printFile(File file) {
// 遍历文件夹, 获取其中的每一个文件和文件夹
File[] subFiles = file.listFiles();
// subFiles为null, 我们没有办法, 惹不起, 躲得起
if (subFiles != null) {
for (File subFile : subFiles) {
// 如果是文件: 打印
if (subFile.isFile()) {
System.out.println(subFile);
} else {
// 如果是文件夹: 打印文件夹中的所有文件 -> 递归~
printFile(subFile);
}
}
}
}
}
递归出现内存溢出原理
IO
什么是IO?
生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s
,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。
我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input
和输出output
,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用java.io
包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
**流向的分析, 站在内存的角度**
IO分类
-
流向划分
-
- 输入流 :把数据从
其他设备
上读取到内存
中的流。
- 输入流 :把数据从
-
- 输出流 :把数据从
内存
中写出到其他设备
上的流。
- 输出流 :把数据从
-
-
类型划分
-
字节流
-
字节输入流
-
构造方法
-
主要方法
-
-
字节输出流
-
构造方法
-
数据追加续写
-
常用方法
-
写出换行:
-
-
-
字符流
- 使用字符流读取: 将字节转换成字符
-
使用字符流写出: 将字符转换成字节
-
字符输入流
-
构造方法
-
常用方法
-
字符输出流
-
构造方法
-
常用方法
- 注意:
分别使用字节流和字符流写出数据, 没有关流
字节流可以写出
字符流没有写出去
因为: 字符输出流, 默认带有一块缓冲区(数组), 写出数据的时候会先写出到缓冲区中
然后在通过一些方法, 将缓冲区中的内容, 刷出到硬盘的文件上缓冲区的内容刷到文件上有两个场景: 1. 缓冲区满了 2. 手动刷出
- 注意: