缓冲流
是对基本流对象的一种增强,通过缓冲区数组读写,减少系统IO次数,提高读写效率
字节缓冲流
字节缓冲输出流
BufferedOutputStream extends OutputStream
继承父类成员方法
构造方法:
BufferedOutputStream ( OutputStream out ) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
BufferedOutputStream ( OutputStream out , int size ) 创建一个新的缓冲输出流,将指定缓冲区大小的数据写入指定的底层输出流
OutputStream out :字节输出流
传递一个FileOutputStream , 缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
int size : 指定缓冲流内部缓冲区大小,不写默认大小
步骤:
- 创建FileOutputStream 对象,构造方法绑定要输出的目的地
- 创建BufferedOutputStream 对象,传递FileOutputStream 对象,提高FileOutputStream 对象效率
- 使用BufferedOutputStream 对象的方法write( 字符要.getBytes() 转换为字节 )写入到内部缓冲区中,
- flush+close,刷新+释放资源
字节缓冲输入流:给字节输入流增加缓冲区(数组)
BufferedInputStream extends InputStream
BufferedInputStream b = new BufferedInputStream ( new FileInputStream ( ) )
传递FileInputStream
BufferedOutputStream ( InputStream in) 创建一个BufferedInputStream ,保存参数in
BufferedOutputStream ( InputStream in , int size )
字符缓冲流
字符缓冲输出流
BufferedWriter extends Writer
使用Writer成员方法
构造方法:
BufferedWriter (Writer out ) :创建应该使用默认大小输出缓冲区的缓冲字符输出流
BufferedWriter (Writer out , int sz)
Writer out:字符输出流,可以传递FileWriter,缓冲流会给FileWriter应该缓冲区,提高效率
int sz:缓冲区大小,不写默认大小
特有成员方法:void newLine( ) 写入一个换行符。
BufferedWriter ( new FileWriter( ) )
字符缓冲输入流
BufferedReader extends Reader
BufferedReader (Reader in ) :创建应该使用默认大小输入缓冲区的缓冲字符输入流
BufferedReader (Reader in , int sz)
特有成员方法:
String readLine( ) 读取一个文本行,读取一行数据
行终止符号:换行(’\n’),回车(’\r’),回车后面跟换行(’\r\n’)
返回值:末尾返回null
转换流
字符集
编码集:存储识别各种字符集
ASCII码:现代英语,使用7位(bits)表示一个字符,共128字符,扩展使用8bits表示一个字符
ISO-8859-1:拉丁码表,单字节编码,兼容ASCII编码
GBxxx:国标,GBK–一个中文2个字节
Unicode:表示任意语言任意字符设计。UTF-8 一个中文3个字节
转换流:解决FileWriter/FileReader 的转换乱码问题,即字符集使用错误等等
OutputStreamWriter extends Writer 是 FileWriter 的父类
将指定的charset将要写入流中的字符编码成字节(编码)
父类成员方法
构造方法:
OutputStreamWriter ( OutputStream out ):创建使用默认字符编码的OutputStreamWriter
OutputStreamWriter ( OutputStream out ,String charsetName ):创建使用指定字符集的OutputStreamWriter
参数
OutputStream out:字节输出流,写转换之后字节到文件
String charsetName:编码表名称,默认UTF-8
new OutputStreamWriter ( new FileOutputWriter )
InputStreamReader extends Reader (解码)
InputStreamReader ( InputStream in ):创建使用默认字符编码的InputStreamReader
InputStreamReader ( InputStream in ,String charsetName ):创建使用指定字符集的InputStreamReader
String charsetName:编码表名称,与文件编码相同,不默认UTF-8
序列化
把对象以流的方式,写入到文件中保存,叫写对象,也叫对象的序列化。
Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输。
把文件中保存的对象,以流的方式读取出来,叫对象的反序列化
interface Serializable 启动序列化的接口。
实现序列化时未能实现接口,会抛出NotSerializableExceptions异常
对象的序列化
ObjectOutputSteam extends OutputStream
构造方法:ObjectOutputSteam ( OutputStream out )
OutputStream out:字节输出流
成员方法:void writeObject( Object obj ) 将指定的对象写入ObjectOutputStream
使用步骤:
- 创建ObjectOutputStream,构造方法中转递字节输出流
- 使用ObjectOutputStream的writeObject,把对象写入到文件中
- 释放资源
关键字:transient:瞬态关键字,transient是短暂的意思
由于被static修饰的成员变量不能被序列化,序列化的都是对象
被transient修饰的成员变量,也不能被序列化,类似于static
对象的反序列化
ObjectInputSteam extends InputStream
构造方法:ObjectInputSteam ( InputStream in)
成员方法:Object readObject( ) 从 ObjectInputSteam 读取对象,读取完可能需要进行强制类型转换:例如(ArrayList)XXX
反序列化冲突:InvalidClasException异常
出现原因:序列化后,修改类定义,导致反序列化出现问题
解决:将serialVersionUID(序列化之后的对应ID,使用此ID进行验证序列化对象的发送者和接受者是否一样)设置为常量 final long serialVersionUID = 1L
打印流
PrintStream extends OutputSteam
特点:
- 只负责数据输出,不负责数据的读取
- PrintStream永远不会抛出IOException
- 特有方法
构造方法:
- PrintStream(File file):输出目的地是一个文件
- PrintStream(OutputStream out)
- 路径PrintStream(String fileName):输出目的地是一个文件路径
打印流方向:将输出语句的目的地改为参数中传递的打印流的目的地
PrintStream ps = new PrintStream( “XXX.txt” )
System.setOut(ps);
System.ou.print(“XXX”);//XXX写入到文件中