Java高级学习-IO(2)

缓冲流

是对基本流对象的一种增强,通过缓冲区数组读写,减少系统IO次数,提高读写效率

字节缓冲流

字节缓冲输出流

BufferedOutputStream extends OutputStream

继承父类成员方法

构造方法:

BufferedOutputStream ( OutputStream out ) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流

BufferedOutputStream ( OutputStream out , int size ) 创建一个新的缓冲输出流,将指定缓冲区大小的数据写入指定的底层输出流

OutputStream out :字节输出流

传递一个FileOutputStream , 缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率

int size : 指定缓冲流内部缓冲区大小,不写默认大小

步骤:

  1. 创建FileOutputStream 对象,构造方法绑定要输出的目的地
  2. 创建BufferedOutputStream 对象,传递FileOutputStream 对象,提高FileOutputStream 对象效率
  3. 使用BufferedOutputStream 对象的方法write( 字符要.getBytes() 转换为字节 )写入到内部缓冲区中,
  4. 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

使用步骤:

  1. 创建ObjectOutputStream,构造方法中转递字节输出流
  2. 使用ObjectOutputStream的writeObject,把对象写入到文件中
  3. 释放资源

关键字: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写入到文件中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值