多线程:
同步代码块
格式:Synchronized(锁) {
操作共享数据的代码
}
-
特点1:锁默认打开,有一个线程进去了,锁自动关闭。
-
特点2:里面的代码全部执行完毕,线程处理,锁自动打开。
-
小细节:锁一定是唯一的,一般使用字节码文件去实现。
同步方法
就是把 sychronized 关键字加到方法上
格式:修饰符 synchronized 返回值类型 方法名 (方法参数){……}
-
特点1:同步方法是锁住方法里面所有的代码
-
特点2:锁对象不能自己指定
-
非静态:this,静态:当前类的字节码文件对象。
锁
死锁:记住俩个锁不能嵌套,不然就会死锁。
等待唤醒机制
IO流
概述
IO流:存储和读取数据的解决方案
内存无法永久化存储,程序停止,数据丢失,因此需要文件来保存这些数据
IO流的分类
根据流的方向分为输入流和输出流。
输入流:读取
输出流:写出
这里参照物设置为程序,输入流即输入程序,也就是读取文件中的内容,输出流即输出程序,也就是把数据输出到文件中。
按操作文件类型分为字节流和字符流。
字节流:所有文件的类型
字符流:纯文本文件
小结:
-
什么是IO流
存储和读取数据的解决方案
I:input O:output
流向水流一样传输数据
-
IO流的作用
用于读写数据(本地文件,网络)
-
IO流按照流向分类为:
输出流:程序-->文件
输入流:文件-->程序
-
IO流按照操作文件的欸写可以分类为
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件
-
什么是纯文本文件?
md文件,xml文件,lrc文件等
FileOutStram
操作本地的文件的字节输出流,可以把程序中的数据写道本地文件中。
书写步骤:
-
创建字节输出流对象
-
写数据
-
释放资源、
书写细节
创建字节输出流对象书写细节
-
参数是字符串表示的路径或者是file对象都是可以的
-
如果文件不存在,会创建应该新的文件,但是要保证父级路径是存在的。
-
如果文件已经存在,则会清空文件。
写数据书写细节
-
write方法的参数是整数,但是实际上写到本地文件中是整数在ASCII上对应的字符
书房资源
-
每次使用完之后都要释放资源
写数据的三种方式
FileInputStream
步骤同输出流一样
书写细节
-
创建字节输入流对象
如果文件不存在,就直接报错
-
读取数据
一次读一个字节,读出来的是数据在ASCII上对应的数字
读到文件末尾了,read方法返回-1
-
释放资源
每次使用完之后必须要释放资源
一次读取多个字节
5M的数组——>1024 * 1024 * 5
字符集
GBK字符集完全兼容ASCII字符集
一个英文站一个字节,二进制第一位是0
一个中文占俩个字节,二进制高位字节的第一位是1
Unicode字符集的UTDF-8编码格式
一个英文占一个字节,二进制第一位是0
一个中文占3个字节,二进制第一位是1,第一个字节转成十进制是负数
为什么会有乱码
原因1:读取数据未读完整个汉字
原因2:编码和解码时的方式不统一
疑问:字节流读取中午时会乱码,但为什么拷贝不会乱码。
因为拷贝是一个字节一个字节的拷贝,存放之后数据不会丢失
如何不产生乱码
不要用字节流读取文本文件,
编码解码使用同一个码表,同一个编码方式
解码和编码代码实现
字符流
字符流的底层其实就是字节流
字符流=字节流+字符集
特点:
输入流:一次读一个字节,遇到中文,一次读取多个字节
输出流:底层会把数据按照之间的编码方式进行编码,变成字节再写到文件中。
使用场景:
对纯文本文件进行读写操作
FileReader
FileWriter
书写细节
-
创建字符输出流对象
参数是字符串表示的路径或者是file对象都可以
如果文件不存在会创建一个文件,但要保证父级路径是存在的
如果文件已经存在,则会清空文件,如果不想清空,就打开续写开关
-
写数据
如果write方法的参数是整数,但是实际写到本地文件中的是整数在字符集上对应的字符
-
释放资源
每次使用完之后都要释放资源
高级流
缓冲流
字节缓冲流
缓冲流还可以搭配一次性读取多个字节一同使用
字符缓冲流
字符缓冲输入流
字符缓冲输出流
总结
-
缓冲流有几种
字节缓冲输入流:BufferedInputStream
字节缓冲输出流:BufferedOutStream
字符缓冲输入流:BufferedReader 字符缓冲输出流:BufferedWriter
-
缓冲流为什么可以提高性能
缓冲流自带长度未8192的缓冲区
可以显著提高字节流的读写性能
对于字符流提升不明显,对于字符缓冲流而言关键点是俩个
转化流:
作用 1:指定字符集读写//淘汰了
作用 2:字节流想要使用字符流中的方法
序列化流和反序列化流
序列化输出流写出一个对象
反序列化输入流读入对象
固定版本号
序列化流/反序列化流的细节汇总
-
使用序列化流将对象写到文件时,需要让javabean类实现Seralizable接口。
-
序列化流写到文件中的数据时不能修改的,一旦修改了就无法再次被读回来了
-
序列化对象后,修改了Javabean类,再次反序列化,会抛出InvalidClassException异常;解决方案:给javabe类添加版本号
-
如果一个对象中的某个成员变量不想被序列化;解决方案:给该成员变量加上transient关键字修饰,该关键字标记的成员变量不参与序列化过程。
打印流
分类:打印流一般是指。printfStream,PrintWriter俩个类
特点1:打印流之操作文件目的地,不操作数据源
特点2:特有的写出方法可以实现,数据原样写出
例如:打印:97 文件中:97
打印:true 文件中:true
特点3:特有的写出方法,可以实现自动刷新,自动换行,打印一次数据=写出+换行+刷新
字节打印流
字符打印流
总结
打印流有几种?各有什么特点?
-
有字节打印流和字符打印流俩种
-
打印流不操作数据源,只操作目的地
-
字节打印流:默认自动刷新,特有的println自动换行
-
字符打印流:自动刷新需要开启,特有的println自动换行
压缩流和解压缩流
解压缩
压缩文件
总结:学完IO流中的工具类,完成数据库连接的登录注册界面,然后学习网络编程。