回顾
线程池
把多个线程放在线程池,用的时候拿出来使用,用完之后再放回线程池,可以反复使用线程对象,提高效率。
死锁产生的原因
要有多个线程
要有多个锁
线程获取到了不同的锁
(同步代码块的嵌套)
说出线程6个状态的名称
新建状态
可运行状态
锁阻塞状态
无限等待状态
计时等待状态
终止状态
理解等待唤醒案例
wait() :等待,调用这个方法之后线程会释放锁给别的线程使用
notify() :唤醒,唤醒正在等待这个锁的某个线程
这两个方法必须使用锁对象来调用
Lambda表达式
前提
必须用于函数式接口,接口中抽象方法只有一个
格式
(方法的参数)->{方法的代码}
简化
(int a) ->{System.out.println(a);};
a ->System.out.println(a);
掌握常用的流操作[可以忘]
获取流:
list.stream();
set.stream();
Stream.of(arr);
常用操作:
终结方法:
count() :获取元素的个数
forEach():遍历元素
非终结方法:
filter() :过滤元素
limit() :选取前几个
skip() :跳过前几个
map() :映射,把一种类型转成另一种类型
concat() :合并两个流的元素
收集:
stream.collect(Collectors.toList());
stream.collect(Collectors.toSet());
stream.toArray();
1.File类
1.概述
File表示文件或文件夹的抽象路径。
注意:抽象路径的意思是路径可以存在也可以不存在。
2.构造方法
方法 | 说明 |
---|---|
public File(String pathname) | 给定路径名称创建File对象 |
public File(String parent, String child) | 给定父路径和子路径创建File对象 |
public File(File parent, String child) | 给定父路径的File类型和子路径创建File对象 |
-
代码演示
package com.itheima_01; import java.io.File; //在java语言中 ""里面的\必须写成\\ // \本身是转义字符的意思 public class Test01 { public static void main(String[] args) { //File的构造方法 //public File(String pathname) //给定路径名称创建File对象 File f = new File("C:\\Users\\jin\\Desktop\\day10"); //File f = new File("C:/Users/jin/Desktop/day10"); System.out.println(f); //public File(String parent, String child) //给定父路径和子路径创建File对象 //File f2 = new File("C:\\Users\\jin\\Desktop","day10"); File f2 = new File("C:\\Users\\jin","Desktop\\day10"); System.out.println(f2); //public File(File parent, String child) //给定父路径的File类型和子路径创建File对象 File f3 = new File("C:\\Users\\jin\\Desktop"); File f4 = new File(f3,"day10"); System.out.println(f4); } }
3.获取方法
-
方法介绍
方法 说明 getAbsolutePath() 获取绝对路径 getPath() 获取创建对象时的路径 getName() 获取文件名 length() 获取文件大小(不能获取目录的大小) -
代码演示
package com.itheima_01; import java.io.File; public class Test02 { public static void main(String[] args) { //获取方法 File f = new File("C:\\Users\\jin\\Desktop\\123.txt"); //getAbsolutePath() //获取绝对路径(从盘符开始的路径就是绝对路径) System.out.println(f.getAbsolutePath()); //getPath() //获取创建对象时的路径 System.out.println(f.getPath()); //getName() //获取文件名(获取最后一级名字) System.out.println(f.getName()); //length() //获取文件大小,不能获取目录的大小 //文件大小就是文件的字节数 System.out.println(f.length()); //435字节 } }
4.绝对路径和相对路径
绝对路径:从盘符开始的路径叫绝对路径。
相对路径:不以盘符开始写的路径就是相对路径。
public class Test03 {
public static void main(String[] args) {
//绝对路径
File f1 = new File("C:\\User\\jin\\Desktop\\123.txt");
File f2 = new File("C:\\soft\\IdeaProjects\\tjjavaSE05\\abc.txt");
System.out.println(f2.length());
//如果要表示当前项目下的路径
//就可以使用相对路径,相对路径就是默认会在当前项目下寻找
File f3 = new File("abc.txt");
System.out.println(f3.length());
File f4 = new File("day10\\aaa.txt");
System.out.println(f4.length());
}
}
5.判断方法
-
方法介绍
方法 说明 exists() 判断路径是否存在 isFile() 判断是否是文件 isDirectory() 判断是否是文件夹(目录) -
代码演示
package com.itheima_01; import java.io.File; public class Test04 { //判断方法 public static void main(String[] args) { File f = new File("day10\\src"); //exists() //判断路径是否存在 System.out.println(f.exists()); //isFile() //判断是否是文件,如果不是文件或不存在false System.out.println(f.isFile()); //isDirectory() //判断是否是文件夹(目录),如果不是文件夹或不存在false System.out.println(f.isDirectory()); } }
5.创建删除方法
-
方法介绍
方法 说明 createNewFile() 创建一个文件 delete() 删除一个文件或空文件夹(不能删除有文件的文件夹) mkdir() 创建单层文件夹 mkdirs() 创建任意层文件夹 -
代码演示
package com.itheima_01; import java.io.File; import java.io.IOException; public class Test05 { //创建删除方法 public static void main(String[] args) throws IOException { File f0 = new File("day10\\aaa\\sfsd.txt"); File f = new File("day10\\aaa"); //createNewFile() //创建一个文件 f.createNewFile(); //delete() //删除一个文件或空文件夹(不能删除有文件的文件夹) //删除方法不走回收站,你别删除有用的文件 f0.delete(); f.delete(); //mkdir() //创建单层文件夹 File f2 = new File("day10\\aaa"); f2.mkdir(); //mkdirs() //创建任意层文件夹 File f3 = new File("day10\\bbb\\ccc"); f3.mkdirs(); } }
6.遍历目录方法
-
方法介绍
方法 说明 list() 获取目录下所有内容的名称 listFiles() 获取目录下所有内容的File对象形式 -
代码演示
package com.itheima_01; import java.io.File; public class Test06 { public static void main(String[] args) { File f = new File("C:\\Users\\jin\\Desktop\\day10"); //list() //获取目录下所有内容的名称 String[] list = f.list(); //遍历 for (String s : list) { System.out.println(s); } System.out.println("---------------------------"); //listFiles() //获取目录下所有内容的File对象形式 File[] files = f.listFiles(); //遍历 for (File file : files) { System.out.println(file); } } }
-
练习
- 统计文件夹下java文件的个数
package com.itheima_01; import java.io.File; public class Test07 { //统计文件夹下java文件的个数 public static void main(String[] args) { File f = new File("C:\\Users\\jin\\Desktop\\新建文件夹"); //获取文件夹下内容的名称 File[] files = f.listFiles(); //遍历 for (File file : files) { if(file.isFile()&&file.getName().endsWith(".java")){ System.out.println(file.getName()); } } } }
2.递归
1.概述
递归就是把一个大问题拆分成同类型的小问题去解决。
在java中递归就是方法自己调用自己。
不能无限递归,递归要有尽头。
从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,他讲的故事是
从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,他讲的故事是
从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,他讲的故事是
2.求5的阶乘
5! = 4! * 5;
4! = 3! * 4;
3! = 2! * 3;
2! = 1! * 2;
1! = 1;
n! = (n-1)! * n;
package com.itheima_02;
public class Test01 {
//虚拟机调用
public static void main(String[] args) {
int result = jieCheng(5);
System.out.println("5的阶乘是" + result);
}
//递归方法
//求n的阶乘
public static int jieCheng(int n){
if(n == 1){
return 1;
}
//n的阶乘 = n-1的阶乘 * n;
return jieCheng(n-1) * n;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYY5XuVl-1598452316941)(img\递归求阶乘.png)]
3.查找文件夹下所有的.java文件
package com.itheima_02;
import java.io.File;
public class Test02 {
//递归打印文件夹下所有.java文件
public static void main(String[] args) {
//调用
print(new File("C:\\Users\\jin\\Desktop\\新建文件夹"));
}
//递归方法
public static void print(File file){
//调用获取文件夹下的内容
File[] files = file.listFiles();
//遍历
for (File f : files) {
//对f做一个判断
if(f.isFile()){
if(f.getName().endsWith(".java")){
System.out.println(f);
}
}else if(f.isDirectory()){
//判断是文件夹
print(f);
}
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wclHppm-1598452316944)(img\递归查文件.png)]
3.IO流
1.什么是IO
I是In的意思,O是Out的意思。IO是对于数据的输入和输出。
2.IO的分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vujnyA7A-1598452316946)(img\IO流分类.png)]
4.字节流
其实在计算机中任何数据都是以字节的方式保存的。字节流可以以字节的方式来操作数据。
1.输出流父类OutputStream
-
常用方法
方法 说明 close() 关闭流资源 write(byte[] b) 输出字节数组 write(byte[] b, int off, int len) 输出字节数组的一部分。off表示开始索引,len表示个数 write(int b) 输出一个字节
2.输出流子类FileOutputStream
-
构造方法
方法 说明 public FileOutputStream(File file) 向指定文件位置输出数据 public FileOutputStream(String name)* 向指定字符串路径输出数据 public FileOutputStream(File file,boolean b) 创建对象的同时指定是否续写true表示是 public FileOutputStream(String name,boolean b)* 创建对象的同时指定是否续写true表示是 -
代码演示
- 构造方法演示
package com.itheima_03; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class Test01 { public static void main(String[] args) throws FileNotFoundException { //字节输出流的构造方法 /* 注意事项: 如果文件不存在构造方法会创建文件 如果文件已存在构造方法会覆盖文件 构造方法只能指向文件,不能指向文件夹(报错:拒绝访问。) true表示续写,如果文件存在不会覆盖之前的内容,在原来内容的基础上续写 */ //new FileOutputStream(String pathname) :参数表示路径名称 //FileOutputStream fos = new FileOutputStream("day10\\123.txt"); //new FileOutputStream(File file) :参数表示路径名称 //FileOutputStream fos2 = new FileOutputStream(new File("day10\\123.txt")); //new FileOutputStream(String pathname,boolean b) // :参数表示路径名称,第二个参数表示是否续写 FileOutputStream fos = new FileOutputStream("day10\\123.txt",true); //new FileOutputStream(File file,boolean b) // :参数表示路径名称,第二个参数表示是否续写 //FileOutputStream fos2 = // new FileOutputStream(new File("day10\\123.txt"),true); } }
- 常用方法的演示
package com.itheima_03; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Test02 { //FileOutputStream的方法 public static void main(String[] args) throws IOException { //创建对象 FileOutputStream fos = new FileOutputStream("day10\\123.txt"); //write(int b) byte -128 ~ 127 //输出一个字节,保存的是对应的字符 fos.write(97); //write(byte[] b) //输出字节数组 byte[] arr = {65,66,68,100,102}; fos.write(arr); //write(byte[] b, int off, int len) //输出字节数组的一部分。off表示开始索引,len表示个数 fos.write(arr,2,3); //close() //关闭流资源,关闭之后就不能用了 fos.close(); } }
- 输出换行
//输出 for (int i = 48; i < 58; i++) { //换行 fos.write('\r'); fos.write('\n'); fos.write(i); }
3.输入流父类InputStream
-
常用方法
方法 说明 close() 关闭流资源 read() 每次读取一个字节,返回值代表的是字节 read(byte[] b) 每次读取一个数组的字节,返回值代表读取到的字节个数
4.输入流子类FileInputStream
-
构造方法
方法 说明 FileInputStream(File file) 从指定的File文件读取数据 FileInputStream(String name) 从指定字符串路径位置读取数据 -
代码演示
- 构造方法演示
package com.itheima_03; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class Test04 { public static void main(String[] args) throws FileNotFoundException { //字节输入流FileInputStream的构造方法 /* 注意事项: 如果文件不存在,构造方法会报错 (报错:系统找不到指定的文件。) 构造方法只能指向文件,不能指向文件夹(报错:拒绝访问。) */ //FileInputStream(File file) //从指定的File文件读取数据 FileInputStream fis = new FileInputStream(new File("day10\\123.txt")); //FileInputStream(String name) //从指定字符串路径位置读取数据 //FileInputStream fis2 = new FileInputStream("day10\\123.txt"); } }
-
输入流的常用方法演示
- 一次读取一个字节
package com.itheima_03; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Test05 { public static void main(String[] args) throws IOException { //创建对象 FileInputStream fis = new FileInputStream("day10\\123.txt"); //read() //每次读取一个字节,返回值代表的是字节的值 /* System.out.println(fis.read()); //97 System.out.println(fis.read()); //98 System.out.println(fis.read()); //13 System.out.println(fis.read()); //10 System.out.println(fis.read()); //99 System.out.println(fis.read()); //如果读取到了文件的末尾,方法会返回-1代表没有了 */ /* fis.read() 执行一次读取方法 i=fis.read() 把结果赋值给i i != -1 判断i的值是否是-1 */ int i; while((i=fis.read()) != -1){ System.out.println(i); } //close() //关闭流资源 fis.close(); } }
- 一次读取一个字节数组
package com.itheima_03; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; public class Test06 { public static void main(String[] args) throws IOException { //创建对象 FileInputStream fis = new FileInputStream("day10\\123.txt"); //read(byte[] b) //每次读取一个数组的字节,返回值代表读取到的字节个数 //把数据放到数组中,返回的是字节个数 /* byte[] arr = new byte[5]; //第一次读取 System.out.println(fis.read(arr)); //字节个数:5 System.out.println(Arrays.toString(arr)); //[97, 98, 99, 100, 101] // // //第二次读取 System.out.println(fis.read(arr)); //字节个数:2 System.out.println(Arrays.toString(arr)); //[102, 103, 99, 100, 101] // // //第三次读取 System.out.println(fis.read(arr)); //字节个数:-1文件读取到最后,会返回-1表示没有了 System.out.println(Arrays.toString(arr)); //[102, 103, 99, 100, 101] */ //循环 byte[] arr = new byte[5]; int len; while((len=fis.read(arr)) != -1){ System.out.print(new String(arr,0,len)); } //close() //关闭流资源 fis.close(); } }
5.案例:图片复制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCPmXACe-1598452316949)(img\文件复制.png)]
5.字符流
字符流专门用来操作中文文本,因为一个中文占用多个字节。
1.字符输入流父类Reader
方法 | 说明 |
---|---|
close() | 关闭流资源 |
read() | 读取一个字符 |
read(char[] chs) | 读取一个字符数组的内容 |
2.FileReader类
-
构造方法
方法 说明 FileReader(File file) 使用File对象的路径创建输入流 FileReader(String fileName) 使用字符串路径创建输入流 -
代码演示
- 构造方法演示
package com.itheima_04; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; public class Test04 { //FileReader的构造方法 public static void main(String[] args) throws FileNotFoundException { /* 注意事项: 如果文件不存在,会抛出异常(报错:系统找不到指定的文件) 构造方法只能写文件,不能写文件夹(报错:拒绝访问) */ FileReader fr = new FileReader("day10\\123.txt"); //FileReader f2 = new FileReader(new File("day10\\123.txt")); } }
-
常用读取方法演示
- 一次读取一个字符
package com.itheima_04; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Test05 { public static void main(String[] args) throws IOException { //创建对象 FileReader fr = new FileReader("day10\\123.txt"); //read() //读取一个字符,返回的是字符的值,如果读到了末尾,会返回-1表示没有了 /* System.out.println(fr.read()); //97 System.out.println(fr.read()); //98 System.out.println(fr.read()); //25105 System.out.println(fr.read()); //20320 System.out.println(fr.read()); //-1 */ int ch; while((ch=fr.read()) != -1){ System.out.println((char)ch); } //close() //关闭流资源 fr.close(); } }
- 一次读取字符数组
package com.itheima_04; import java.io.FileReader; import java.io.IOException; import java.util.Arrays; public class Test06 { public static void main(String[] args) throws IOException { //创建对象 FileReader fr = new FileReader("day10\\123.txt"); //read(char[] arr) //每次读取多个字符,返回值表示读到的字符个数,如果读到了末尾返回-1 /* char[] arr = new char[5]; //第一次读取 System.out.println(fr.read(arr)); //读到的个数5 System.out.println(Arrays.toString(arr)); //[a, b, c, d, e] //第二次读取 System.out.println(fr.read(arr)); //读到的个数4 System.out.println(Arrays.toString(arr)); //[f, 我, 爱, 你, e] //第三次读取 System.out.println(fr.read(arr)); //-1 System.out.println(Arrays.toString(arr)); //[f, 我, 爱, 你, e] */ //循环 char[] chs = new char[5]; int len; while((len=fr.read(chs)) != -1){ System.out.println(new String(chs,0,len)); } //close() //关闭流资源 fr.close(); } }
3.字符输出流父类Writer
- 常用方法
方法 | 说明 |
---|---|
close() | 关闭流资源 |
flush() | 刷新 |
write(int c) | 写出一个字符 |
write(char[] cbuf) | 写出一个字符数组的内容 |
write(char[] b, int off, int len) | 写出一个字符数组的一部分 |
write(String str) | 写出一个字符串 |
4.FileWriter类
-
构造方法
方法 说明 FileWriter(File file) 用File对象所表示的路径创建输出流对象 FileWriter(String fileName) File字符串所表示的路径创建输出流对象 FileWriter(File file,boolean b) 用File对象所表示的路径创建输出流对象,true表示续写 FileWriter(String fileName,boolean b) File字符串所表示的路径创建输出流对象,true表示续写 -
代码演示
- 构造方法演示
package com.itheima_04; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class Test01 { public static void main(String[] args) throws IOException { //字符输出流FileWriter构造方法 /* 注意事项: 如果文件不存在,会自动创建文件 如果文件已存在,会覆盖原有文件 构造方法中只能写文件,不能写文件夹(报错:拒绝访问。) 如果加上一个true,表示在原有文件内容上续写 */ //new FileWriter(String name) //FileWriter fw = new FileWriter("day10\\123.txt"); //new FileWriter(File file) //FileWriter fw2 = new FileWriter(new File("day10\\123.txt")); //new FileWriter(String name,boolean b) //FileWriter fw = new FileWriter("day10\\123.txt",true); //new FileWriter(File file,boolean b) FileWriter fw = new FileWriter(new File("day10\\123.txt"),true); } }
-
常用方法演示
- 关闭和刷新
package com.itheima_04; import java.io.FileWriter; import java.io.IOException; public class Test02 { public static void main(String[] args) throws IOException { //字符输出流 关闭和刷新 //创建对象 FileWriter fw = new FileWriter("day10\\123.txt"); //如果缓冲区满了或者调用了刷新方法数据才会真正进入文件 fw.write(97); fw.write(98); //flush() //在输出数据时,会先存到缓冲区 //刷新,刷新之后可以继续输出 //fw.flush(); //close() //关闭流资源 //在关闭流的时候,会自动刷新缓冲区的剩余内容 //只要最后调用了关闭方法,数据就一定都进到文件了 fw.close(); } }
- 常用方法
package com.itheima_04; import java.io.FileWriter; import java.io.IOException; public class Ttest03 { public static void main(String[] args) throws IOException { //FileWriter的输出方法 FileWriter fw = new FileWriter("day10\\123.txt"); //write(int c) //写出一个字符 fw.write(97); fw.write('a'); fw.write('我'); //write(char[] cbuf) //写出一个字符数组的内容 char[] arr = {'a','b','c','d'}; fw.write(arr); //write(char[] b, int off, int len) //写出一个字符数组的一部分 fw.write(arr,2,2); //write(String str) //写出一个字符串 fw.write("柳岩瞎写"); //关闭 fw.close(); } }
字节流和字符流的区别
字节流:
操作文本文档以外的数据时一定使用字节流
字符流:
操作文本文档就用字符流