缓冲流的原理
对基本流进行增强
给基本的字节输入流增加一个缓冲区,这个缓冲区就是一个数组,这样可以提高基本的字节输入流的读取效率
BufferedInputStream(new FileInputStream())
BufferedOutputStream缓冲字节输出流
这个流继承了OutputStream,所以是一个字节流
构造方法:
OutputStream out:字节输出流
我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
size:指定缓冲区的大小,如果不指定就是默认的大小
使用步骤:
1.创建一个FileOutputStream对象,构造方法中绑定要输出的目的地
2.创建BufferedOutputStream对象,构造放啊中传递第一步创建的实例化对象,提高效率
3.使用其write使用缓冲区中
4.使用flush方法把内部缓冲区的数据,刷新到文件中
5.释放资源(会先调用flush方法刷新数据)
字节缓冲区输入流BufferedInputStream
继承了InputStream的方法:
构造方法:
参数:
同输出流
使用步骤:
1.创造FileInputStream对象,构造方法中绑定要读取的数据源
2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象
3.read方法
4.释放资源
缓冲流的效率测试复制文件
使用缓冲流复制的步骤:
1.创建字节缓冲输入流方法
2.创建字节缓冲输出流的方法
3.使用字节缓冲输入流对象中的方法read,读取文件
4.使用字节缓冲输出流中的方法write,把读取的数据写入到内部的缓冲区中
5.释放资源
BufferedWriter字符缓冲流
继承自父类的共性
构造方法:
特有的成员方法:
void newLine()写一个行分隔符,会根据不同的操作系统,获取不同的行分隔符
使用步骤
字符输入流可以直接输入字符串,而字节输入流需要把字符串转换成字节数组之后进行输入要调用字符串的。getbyte方法
BuferedReader字符缓冲输入流
特有方法:
String readline()读一行文本
行的中止符号:通过下列字符之一即可认为某行中止:换行(”\n”)、(‘\r’)或者回车后裔直接跟着换行(\r\n)
返回值:
包含该内容的字符串,不包含任何行终止符,如果达到末尾,则返回null
对文本进行切割,用字符串的方法split进行切割,其参数是根据什么切割(符号例如.,空格)
调用一次就自动读取下一行
转换流
字符编码和字符集
字符编码:自然语言与二进制的对应
字符集:ASCII,GBK,UTF-8(用的最多)等等编码
编码引出的问题
FileReader读取GBK(win系统默认编码)文件会产生乱码
FilrReader可以读取IDE默认编码格式(utf-8)的文件
转换流的原理
InputStreamReader
是字节转化为字符流的桥梁,可以使用指定的字符编码表将其解码为字符
继承了reader可以用reader的全部方法:
构造方法:
使用步骤:
注意事项:
构造方法中指定的编码表名称要和文件编码相同,否则会发生乱码
OutStreamWriter
这个流继承了Writer,所以writer中的方法都可以使用:
构造方法:
参数:
OutputStream out:字节输出流,可以用来写转换之后的文件,一定不能写成了字符流!
Stream charsetName:不区分大小写,可以是utf-8,gbk等等
使用步骤:
1.创建一个OutputStreamWriter对象,构造方法中传递字节输出流和指定编码表名称
2.使用OutputStreamWriter对象中的方法write,把字符转换为字节储存到缓冲区中
3.使用flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节)
4.释放资源
转换文件编码
将GBK编码的文件转化为UTF-8编码文件
思想:将输入流指定为GBK编码输出流转化为UTF-8编码
序列化流和反序列化流
对象包含的不仅仅是字符,使用字节流
ObjectOutputStream:对象的序列化流
writeObject();
把文件中保存的对象,以流的方式读取出来,叫做对象的反序列化
读取的文件保存的都是字节
ObjectInputStream:反序列化流
readObject();
对象的序列化流:ObjectOutputStream
继承了字节输出流
作用:把对象以流的形式写入到文件中保存
构造方法:
特有的方法:
使用步骤:
抛出没有序列化异常,因为要实现Serializable接口,要进行序列化和反序列化的类必须实现Serializable接口,就会添加一个标记,当进行序列化和反序列化的时候就会检测这个类上是否有这个标记,如果有就可以序列化和反序列化,如果没有就会抛出这个异常
这个接口没有任何抽象方法,不需要覆盖重写,只需要将需要存进文件的类进行该接口的实现即可
ObjectInputStream反序列化
把文件中保存的对象,读取出来使用
构造方法:
特有的成员方法
使用步骤:
1.创建ObjectInputStream对象,构造方法中传递字节输入流
2.使用ObjectInputStream对象中的方法readObject读取保存对象的文件
3.释放资源
4.使用读取出来的对象(打印)
readObject方法中除了有IO异常,还有classNotFoundException异常(class文件找不到异常)
当不存在class文件的时候抛出这个异常
这个读出来的东西需要用对象进行储存
transient关键字:瞬态关键字
Static关键字:静态关键字
transient关键字:瞬态关键字,不能被序列化
反序列化操作(续)
当JVM反序列化对象的时候,能找到class文件,但是class文件再序列化对象之后被修改,那么反序列化会失败会抛出InvalidClassException异常
问题描述和解决
在需要序列化的类中手动添加第一行代码
序列化集合
当我们想在文件中保存多个对象的时候,可以把多个对象存到一个集合中,对集合进行序列化和反序列化
打印流的概述和使用
PrintStream打印流:为其它输出流添加了功能让她们能够方便地打印各种数据值表示形式