- 字符流
- 字符输入流Reader
- 常用的方法,跟字节输入流InputStream中的read方法相同,就是把参数类型由byte改为char
- 字节输出流Writer
- 常用方法,除了包含字节输出流OutputStream中的write方法,参数类型由byte改为char,还包含如下:
- void write(int ch) 写单个字符
- void write(String str) 写字符串
- void write(String str, int offset, int len) 将字符串str从offset开始,写len个长度到输出流中
- 常用方法,除了包含字节输出流OutputStream中的write方法,参数类型由byte改为char,还包含如下:
- 字符输入流Reader
- 节点流与处理流
- 节点流 程序直接从数据读写数据,没有中间商。
- 处理流
- 如果只是按照字节或者字符来操作文件,实际应用中有弊端,不能按行读入,不能读取一定格式的数据。为了解决此问题,java提供了处理流
- 处理流相当于从数据源读写的数据,经过中间商的一次再加工。
- 处理流在创建对象时,需要传入另外一个流作为参数,一般节点流对象做参数
- 构造方法 以BufferedInputStream/BufferedOutputStream为例
- BufferedInputStream(InputStream in) 使用字节输入流对象构造一个缓冲输入流对象,默认带8k字节的缓冲区
- BufferedInputStream(InputStream in,int len) 使用字节输入流对象构造一个缓冲输入流对象,指定缓冲区的长度为len
- BufferedOutputStream(OutputStream out) 使用字节输出流对象构造一个缓冲输出流对象,默认带8k字节的缓冲区
- BufferedOutputStream(OutputStream out,int len) 使用字节输出流对象构造一个缓冲输出流对象,指定缓冲区的长度为len
- 常用的方法
- read 与write包含之前的方法,除此之外,还包含如下:
- String readLine(); 一次读取文件的一行,读到文件结束返回null BufferedReader中的方法
- newLine() 输出一个换行
- append()输出流的尾部追加
- read 与write包含之前的方法,除此之外,还包含如下:
- 对象的序列化与反序列化
- 序列化是指将对象转为字节序列的过程
- 反序列化是指将字节序列转为对象的过程
- 应用场景:
- 1、将对象永久保存到文件中
- 2、网络传递对象
- 3、进程中传递对象
- ObjectInputStream与ObjectOutputStream
- 要序列化的对象,要支持序列化,需要实现Serializable接口,该接口不需要实现任何方法。
- 序列化 ObjectOutputStream writeObject(obj) 将obj对象序列化为字节序列写到输出流中。
- 反序列化 ObjectInputStream readObject() 将字节序列读入,并转为对象,反序列化
- transient关键字
- 在类中,如果属性使用transient修饰,该属性的值不参与序列化,static修饰的属性也不参与。
- 多线程
- 进程与线程
- 进程 计算机运行的一个软件(程序),每个进程有自己独有的代码和数据空间,进程之间的切换会有较大的资源开销。
- 线程 一个程序(进程)中内部的多个控制流,一个进程可以包含多个线程,线程之间的切换开销很小。
- 线程创建的两种方式
- 1、继承Thread类
- 1)继承Thread类,重写run()方法(该线程所实现的功能写在run的方法体中)
- 2)创建该类的对象
- 3)对象名.start() 开始执行线程
- 2、实现Runnable接口
- 1)实现Runnable接口,并重写run方法
- 2)创建该实现类的对象
- 3)然后创建一个Thread对象,将2)中的对象传入到构造函数中
- 4)Thread对象.start()启动线程。
- 两种方式比较
- 1、继承方式,该类就不能再继承其他的父类了,如果是接口实现方式,还可以继承其他的父类。因为java中是单一继承,多接口实现。
- 2、这两种方式本质上都是调用Thread中的run方法实现线程的功能。
- 1、继承Thread类
- 线程的生命周期
- 线程对象从创建开始,到线程的结束,在此存在不同的状态:
- 创建状态:new关键字创建之后,就处于新建状态
- 就绪状态:对象调用start方法之后,进入就绪状态,或者从堵塞状态解除堵塞后,也会进入就绪状态
- 运行状态:线程被调度器执行
- 堵塞状态:在运行中的线程如果遇到堵塞事件,会进入堵塞状态。
- 终止状态:线程运行结束,或者产生异常导致结束。
- 线程对象从创建开始,到线程的结束,在此存在不同的状态:
- 线程的主要方法
- sleep(millis) Thread类中的静态方法,接收一个以毫秒为单位的整数,表示让线程休眠多少毫秒。需要使用try-catch来处理InterruptedException异常。
- isAlive() 判断线程是否存活
- Thread.currentThread.getName();获取当前运行线程的名字
- setName(String name) 可以通过线程对象给线程设置名字。
- yield()让出该线程的cpu资源给其他线程。
- 线程优先级
- 处于就绪状态的线程,如果有多个,线程调度器在选择执行就绪状态的线程时,会根据优先级的高低不同,来优先选择级别高的执行。
- 注意:优先选择,仅仅是指优先级高的线程被选中的概率要比优先级低的概率大。
- 线程的优先级分为10个等级,1~10,默认是5,数字越大级别越高。
- Thread.MAX_PRIORITY //10 表示最高优先级
- Thread.NORM_PRIORITY //5 表示默认优先级
- Thread.MIN_PRIORITY //1 表示优先级最低
- setPriority(int ) //设置线程的优先级
- getPriority() 查看线程的优先级
- 处于就绪状态的线程,如果有多个,线程调度器在选择执行就绪状态的线程时,会根据优先级的高低不同,来优先选择级别高的执行。
- 线程的终止
- 一般情况要终止线程,使用标志位来判断。
- 进程与线程