字节输出流:
FileOutputStream
写入数据:write()
字节输入流:
FileInputStream
读取数据:read()
1、字符输入输出流:
1)字符输出流:FileWriter
2)字符输入流:FileReader
2、练习:
通过字符输入输出流进行文件的复制.
3、缓冲流:(高级流)
BufferedOutputStream 字节缓冲输出流
BufferedInputStream 字节缓冲输入流
缓冲流作用:
提高读取和写入数据的效率.
使用步骤:
1)创建缓冲流对象
例如:
字节缓冲输入流对象 对象名 = new 字节缓冲输入流(字节输入流对象);
字节缓冲输出流对象 对象名 = new 字节缓冲输出流(字节输出流对象);
2)读取或者写入数据:
读取数据:通过字节缓冲输入流对象名.read();
写入数据:通过字节缓冲输出流对象名.writer();
3)释放资源
练习:
分别测试低级流文件复制和高级流文件复制的时间.
要求:
低级流: FileOutputStream FileIutputStream
高级流: BufferedOutputStream BufferedIutputStream
字符缓冲流:
BufferedReader 字符缓冲输入流
BufferedWriter 字符缓冲输出流
创建字符高级流对象:
BufferedReader br = new BufferedReader(new FileReader("文件路径"));
BufferedWriter bw = new BufferedWriter(new FileWriter("文件路径"));
4、多线程:
并行:指两个或者多个事件在同一时刻发生.(同时发生)
并发:指两个或者多个事件在同一时间段内发生的.
进程:是指一个在内存中运行的应用程序.是一个独立的单元,一个进程中至少有一个线程.
线程:是指执行进程中任务功能.
实现多线程两种方式:
1)继承Thread类
使用步骤:
a.自定义一个类型去继承Thread
B.手动添加run()方法,进行重写 (run方法的作用就是写线程功能代码的)
c.创建自定义线程类对象,然后开启线程
例如:
class 类名 extends Thread{
public void run(){
功能代码;
}
}
自定义类名 对象名 = new 自定义类名()
对象名.start().
2)实现Runnable接口
使用步骤:
a.自定义实现类去实现Runnable接口
b.重写run方法
c.需要通过创建线程类的有参构造,把Runnable接口的实现类对象传进去.
d.开启线程.
例如:
class 实现类名 implements Runnable{
public void run(){
功能代码;
}
}
new Thread(实现类对象).start();
3)匿名内部类实现多线程的方式:
例如:
Runnable r=new Runnable(){
public void run(){
功能代码;
}
};
new Thread(r).start();
5、通过同步代码块解决线程安全问题:
同步代码块固定语法:
synchronized(同步锁对象){
需要同步操作的方法
}
注意:
1)对象的同步锁只是一个概念,可以理解为在对象上标记了一个锁.
2)同步锁可以是任意类型.
3)多个线程对象,要使用同一把锁.