目录
2、下面是两个案例:实现某个数的阶乘,和通过递归删除一个多级文件夹
File类
1、概述:
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作
File表示文件夹或者是文件路径
注意事项:File对象只表示一个路径不表示文件,所以不管文件存不存在,File对象都不会报错
2、构造方法:
方法 | 说明 |
---|---|
public File(String pathname) | 给定路径名称创建File对象 |
public File(String parent, String child) | 给定父路径和子路径创建File对象 |
public File(File parent, String child) | 给定父路径的File类型和子路径创建File对象 |
- 1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
- 2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
代码演示:
public static void main(String[] args) {
//public File(String pathname)
//给定路径名称创建File对象
File f1 = new File("C:\\Users\\17539\\Desktop\\123.txt");
//public File(String parent, String child)
//给定父路径和子路径创建File对象
File f2 = new File("C:\\Users\\17539\\Desktop","123.txt");
//public File(File parent, String child)
//给定父路径的File类型和子路径创建File对象
File f3 = new File(new File("C:\\Users\\17539\\Desktop"),"123.txt");
}
3、绝对路径和相对路径 :
绝对路径:就是从盘符开始的路径,例如:C:\aaa\bbb。
相对路径:从项目开始的路径,相对于当前项目的路径,例如项目中有一个模块aaa那么就是例:"aaa\bbb"。
4、关于获取的方法:
方法 | 说明 |
---|---|
getAbsolutePath() | 获取绝对路径 |
getName() | 获取文件名 |
length() | 获取文件大小(不能获取目录的大小) |
代码演示:
public static void main(String[] args) {
//File的获取方法
//创建对象
File f = new File("C:\\Users\\17539\\Desktop\\AAA.java");
//getAbsolutePath()
//获取绝对路径
String s1 = f.getAbsolutePath();
System.out.println(s1);
//getName()
//获取文件或文件夹名
String name = f.getName();
System.out.println(name);
//length()
//获取文件大小(不能获取文件夹的大小)
//如果获取文件夹的大小返回的是0或4096这个结果没有意义
long length = f.length();
System.out.println(length);
}
5、关于判断文件文件夹的方法:
方法 | 说明 |
---|---|
exists() | 判断路径是否存在 |
isFile() | 判断是否是文件 |
isDirectory() | 判断是否是文件夹(目录) |
代码演示:
public static void main(String[] args) {
File f = new File("lianxi\\123.txt");
//exists()
//判断路径是否存在
System.out.println(f.exists()); //true
//isFile()
//判断是否是文件
System.out.println(f.isFile()); //true
//isDirectory()
//判断是否是文件夹
System.out.println(f.isDirectory()); //false
}
6、创建删除文件文件夹的方法:
方法 | 说明 |
---|---|
createNewFile() | 创建一个文件 |
delete() | 删除一个文件或空文件夹(不能删除有文件的文件夹) |
mkdir() | 创建单层文件夹 |
mkdirs() | 创建任意层文件夹 |
代码展示:
public static void main(String[] args) throws IOException {
//File创建和删除方法
File f = new File("C:\\Users\\17539\\Desktop\\abc");
//createNewFile()
//创建一个文件
f.createNewFile();
//delete()
//删除一个文件或空文件夹(不能删除有文件的文件夹)
//注意事项:删除方法会直接删除,不会通过回收站
f.delete();
//mkdir()【由于创建任意层文件夹比较方便,这个方法很少使用】
//创建单层文件夹
f.mkdir();
//mkdirs()
//创建任意层文件夹
f.mkdirs();
}
7、遍历文件夹的方法:
方法 | 说明 |
---|---|
list() | 获取目录下所有内容的名称 |
listFiles() | 获取目录下所有内容的File对象形式 |
public static void main(String[] args) {
//File的遍历文件夹方法
File f = new File("C:\\Users\\17539\\Desktop\\abc");
//list()
//获取目录下所有内容的String名称
String[] strs = f.list();
//遍历数组
for (String str : strs) {
System.out.println(str);
}
//listFiles()
//获取目录下所有内容的File对象形式
File[] files = f.listFiles();
//遍历数组
for (File file : files) {
System.out.println(file.getName());
}
}
8、本章小练习
统计文件夹下java文件的个数
如果只需要使用名字就可以使用list(), 如果要调用File的方法就需要使用listFiles()
public static void main(String[] args) {
//统计文件夹下java文件的个数
File f = new File("C:\\Users\\17539\\Desktop\\abc");
//定义一个计数器
int count = 0;
//遍历文件夹
File[] files = f.listFiles();
//遍历数组
for (File file : files) {
//判断是否是文件 并且是否是.java结尾
if(file.isFile() && file.getName().endsWith(".java")){
count++;
}
}
System.out.println("java文件的个数是" + count);
}
浅谈递归
1、概述:
// 递归就是这种自己调用自己的现象
public static void a(){
a();
}
- 递归就是把大问题变成同类型的小问题去解决。
- 在java中递归体现在方法调用自己。
- 递归必须要有出口。
2、下面是两个案例:实现某个数的阶乘,和通过递归删除一个多级文件夹
递归实现5的阶乘
public static void main(String[] args) {
System.out.println(method(5));
}
public static int method(int n) {
// 等于1则返回1
if (n == 1) {
return 1;
}
//n的阶乘就是(n-1)的阶乘就等于n的阶乘
int jie = method(n - 1) * n;
return jie;
}
递归实现删除多级文件夹
public static void main(String[] args) {
File f = new File("C:\\Users\\17539\\Desktop\\aaa");
method(f);
}
public static void method(File file){
// 遍历文件夹
File[] files = file.listFiles();
for (File file1 : files) {
// 判断时文件还是文件夹
if (file1.isFile()) {
// 删除
file1.delete();
}else{
// 是文件夹递归
method(file1);
}
}
// 循环结束后剩下的就是一个空的文件夹
file.delete();
}
IO流
1、什么是IO流:
IO流其实就是数据的传输,可以看作数据的流动,根据流动的方向不同,以内存为基准,从内存到硬盘叫做写数据(output)输出,从硬盘到内存叫做读数据(input)输入。
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。
2、IO流的分类
根据数据的流向分为:输入流和输出流。
- 输入流 :把数据从 其他设备 上读取到 内存 中的流。
- 输出流 :把数据从 内存 中写出到 其他设备 上的流。
根据数据的类型分为:字节流和字符流。
- 字节流 :以字节为单位,读写数据的流。
- 字符流 :以字符为单位,读写数据的流。
输入流 | 输出流 | |
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
字节流
1、字节
一切文本数据(视频,图片、文本等),存储时,都是以二进制形式保存的,都是一个个字节,传输的时候也是如此,所以字节流可以传输任何类型的字节数据。
在我们操作流时,要知道无论什么流对象底层传输始终是二进制数据。
2、输出流的父类
方法 | 说明 |
---|---|
close() | 关闭流资源 |
write(byte[] b) | 输出字节数组 |
write(byte[] b, int off, int len) | 输出字节数组的一部分。off表示开始索引,len表示个数 |
write(int b) | 输出一个字节 |
3、输出流子类
注意事项:
- 如果文件不存在,输出流会自动创建文件
- 如果文件已存在,输出流会覆盖原有文件
- 流中的路径只能写文件,不能写文件夹,如果写了文件夹拒绝访问。
- 如果在参数加一个true,表示不覆盖原有文件,续写
方法 | 说明 |
---|---|
public FileOutputStream(File file) | 向指定文件位置输出数据 |
public FileOutputStream(String name) | 向指定字符串路径输出数据 |
public FileOutputStream(File file,boolean b) | 创建对象的同时指定是否续写true表示是 |
public FileOutputStream(String name,boolean b) | 创建对象的同时指定是否续写true表示是 |
代码演示:
//public FileOutputStream(File file)
//向指定文件位置输出数据
FileOutputStream fis1 = new FileOutputStream(new File("aaa\\123.txt"));
//public FileOutputStream(String name)
//向指定字符串路径输出数据
FileOutputStream fis2 = new FileOutputStream("aaa\\123.txt");
//public FileOutputStream(File file,boolean b)
//创建对象的同时指定是否续写true表示是
FileOutputStream fis1 = new FileOutputStream(new File("aaa\\123.txt"),true);
//public FileOutputStream(String name,boolean b)
//创建对象的同时指定是否续写true表示是
FileOutputStream fis2 = new FileOutputStream("aaa\\123.txt",true);
常用方法代码展示:
public static void main(String[] args) throws IOException {
//字节输出流的常用方法
//创建字节输出流对象
FileOutputStream fis = new FileOutputStream("day10\\123.txt");
//write(int b)
//输出一个字节(代码上是数值,文件中是对应的ASCII码)
fis.write(97);
fis.write(65);
fis.write(49);
//write(byte[] b)
//输出字节数组
byte[] arr = {97,98,99,100,101,102};
fis.write(arr);
//write(byte[] b, int off, int len)
//输出字节数组的一部分。off表示开始索引,len表示个数
//输出数组中从1索引开始的3个字节
fis.write(arr,1,3);
//close()
//关闭流资源,这个方法在我们使用完流最后调用
fis.close();
}
4、输入流父类
方法 | 说明 |
---|---|
close() | 关闭流资源 |
read() | 每次读取一个字节,返回值代表的是字节 |
read(byte[] b) | 每次读取一个数组的字节,返回值代表读取到的字节个数 |
5、输入流子类
- 虽然参数为int类型四个字节,但是只会保留一个字节的信息写出。
- 流操作完毕后,必须释放系统资源,调用close方法,千万记得。
注意事项:
- 输入流如果文件不存在,会报错(系统找不到指定的文件。)
- 所有流只能写文件,不能写文件夹,如果写了文件夹(拒绝访问)
方法 | 说明 |
---|---|
FileInputStream(File file) | 从指定的File文件读取数据 |
FileInputStream(String name) | 从指定字符串路径位置读取数据 |
代码演示:
//FileInputStream(File file)
//从指定的File文件读取数据
FileInputStream fis1 = new FileInputStream(new File("aaa\\123.txt"));
//FileInputStream(String name)*
//从指定字符串路径位置读取数据
FileInputStream fis2 = new FileInputStream("aaa\\123.txt");
常用方法演示:
1、一次读取一个字节:
public static void main(String[] args) throws IOException {
//创建对象
FileInputStream fis = new FileInputStream("aaa\\123.txt");
//read()
//每次读取一个字节,返回值代表的是字节
//每次读取会自动读取后一个字节内容
//在读取到文件的末尾时,会得到-1,-1代表文件已经结束了
int i;
while((i=fis.read()) != -1){
System.out.println((char)i);
}
//close()
//关闭流资源
fis.close();
}
2、一次读取一个字节数组:
- 使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用。
public static void main(String[] args) throws IOException {
//创建对象
FileInputStream fis = new FileInputStream("aaa\\123.txt");
//read(byte[] b)
//每次读取一个数组的字节,返回值表示读取字节的个数
//如果读到了文件的末尾,返回的是-1
byte[] bys = new byte[5];
int len;
while((len=fis.read(bys)) != -1){
//0代表从0索引开始,len代表的是读取到了几个就打印几个
System.out.println(new String(bys,0,len));
}
//关闭流资源
fis.close();
}
换行符:
回车符 \r 和换行符 \n :
- 回车符:回到一行的开头(return)。
- 换行符:下一行(newline)。
系统中的换行:
- Windows系统里,每行结尾是 回车+换行 ,即 \r\n ;
- Unix系统里,每行结尾只有 换行 ,即 \n ;
- Mac系统里,每行结尾是 回车 ,即 \r 。从 Mac OS X开始与Linux统一
本章小结:复制文件案例
public static void main(String[] args) throws IOException {
//创建输入流
FileInputStream fis = new FileInputStream("C:\\Users\\17539\\Desktop\\timg.jpg");
//创建输出流
FileOutputStream fos = new FileOutputStream("aaa\\b.jpg");
//方法一:
//一次读取一个字节
//int i;
//while((i=fis.read()) != -1){
// //一次输出一个字节
// fos.write(i);
//}
//方法二:
byte[] arr = new byte[1024];
int len;
//一次读取多个字节
while((len=fis.read(arr)) != -1){
//一次写出多个字节
fos.write(arr,0,len);
}
//关闭资源
fos.close();
fis.close();
}
字符流
字符流和字节流其方法使用大同小异就不一一列举了。