IO流
IO
作用:用于读写数据(本地文件,网络)
输出流:程序-->文件
输入流:文件-->程序
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件(用windows自带的记事本打开并且能读懂的文件)
书写细节:
-
创建字节输出流对象
-
参数是字符串表示的路径或者File对象都是可以的
-
如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
-
如果文件已经存在,则会清空文件
-
-
写数据
-
write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCLL上对应的字符
-
-
释放资源
-
每次使用完流之后都要释放资源
-
FileOutputStream
作用:可以把程序中的数据写到本地文件上,是字节流的基本流。
书写步骤:创建对象,写出数据,释放资源
细节:
创建对象:文件存在、文件不存在、追加写入
写出数据:写出整数、写出字节数组、换行写
释放资源:关闭通道
FIleInputStream
书写细节:
-
创建字节流输入流对象
-
如果文件不存在,就直接报错
-
-
读取数据
-
一个读一个字节,读出来的是数据在ASCII上对应的数字
-
读到文件末尾了,read方法返回-1
-
-
释放资源
-
每次使用完流必须要释放资源
-
字符集
-
在计算机中,任意数据都是以二进制的形式来存储的
-
计算机中最小的存储单元是一个字节
-
ASCII字符集中,一个英文占一个字节
-
简体中文版windows,默认使用GBK字符集
-
GBK字符集完全兼容ASCII字符集
一个英文占一个字节,二进制第一位是0
一个中文占两个字节,二进制高位字节的第一位是1
Unicode字符集的UTF-8编码格式
一个英文占一个字节,二进制第一位是0转成十进制是正数
一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数
乱码:
-
不要用字节流读取文本文件
-
编码解码时使用同一个码表,同一个编码方式
缓冲流
-
字节缓冲输入流:BufferedInputStream
-
字节缓冲输出流:BufferedOutputStream
-
字符缓冲输入流:BufferedReader
-
字符缓冲输出流:BufferedWriter
为什么可以提高性能:
-
缓冲流自带长度为8192的缓冲区
-
可以显著提高字节流的读写性能
-
对于字符流提升不明显,对于字符缓冲流而言关键点是两个特有的方法
特有的方法:
-
字符缓冲输入流BufferedReader: readLine()
-
字符缓冲输出流BufferedWriter:newLine()
转换流
-
字符转换输入流:InputStreamReader
-
字符转换输出流:OutputStreamWriter
作用
-
指定字符集读写数据(JDK11之后已经淘汰)
-
字节流想要使用字符流中的方法
序列化流/反序列化流
ObjectOutputStream序列化A(writeObject())
ObjectInputStream反序列化(readObject())
细节:
-
使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则会出现NotSerializableEXception异常。
-
序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。
-
序列化对象后,修改了Javabean类,在此反序列化,会出现问题,会抛出InvalidClassException异常,解决方案:给Javabean类添加serialVersionUID(序列号,版本号)
-
如果一个对象中的某一个成员变量的值不想被序列化,给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
打印流
PrintStream
PrintWrite
-
有字节打印流和字符打印流两种
-
打印流不操作数据源,只能操作目的地
-
字节打印流:默认自动刷新,特有的println自动换行
-
字符打印流:自动刷新需要开启,特有的println自动换行