流分类 | 使用分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InputStream | OutputStream | Reader | Writer | |
节点流 | 访问文件 | FileInputStream | FileOutStream | FileReader | FileWriter |
访问数值 | ByteArrayInputStream | ByteArrayOutStream | CharArrayReader | CharArrayWriter | |
访问管道 | PipedInputStream | PipedOutStream | PipedReader | PipedWriter | |
访问字符串 | StringReader | StringWriter | |||
处理流 | 缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | |||
对象流 | ObjectInputStream | ObjectOutputStream | |||
抽象基类(过滤) | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
打印流 | PrintStream | PrintWriter | |||
推回输入流 | PushbackInputStream | PushbackReader | |||
特殊流 | DataInputStream | DataOutputStream |
4.节点流都是对应抽象基类的实现类,它们都实现了抽象基类的基础读写方法。其中read()方法如果返回-1,代表已经读到数据源末尾。
1、ByteArrayInputStream:字节数组输入字节流--内存输入流 ***
(1)分类:字节流 输入流 节点流
(2)作用:读取内存(缓冲区)里的字节数据
(3)构造方法:
new FileInputStream(File file)
new ByteArrayIntputStream(byte[] b)//参数:对应的缓冲区
(4)方法:
read()....
close()
2、ByteArrayOutputStream:字节数组输出字节流--内存输出流***
(1)分类:字节流 输出流 节点流
(2)作用:把字节数据写到内存里(缓冲区)
(3)构造方法:
new ByteArrayOuputStream()
new ByteArrayOutputStream(int size)
(4)方法
write()...
close()
toByteArray *
toString:把内存里的数据直接变成字符串
3、对象的序列化(serialization)**
(1)何为对象的序列化?
把对象保存到文件里--->对象的序列化
(2)何为反序列化?
把文件里的数据读取出来形成对象--->反序列化
(3)作用:
a、永久保存数据(持久化)
b、可以在网络之间传输数据
(4)如何实现?
a、ObjectOutputStream:对象输出流
分类:字节流 输出流 处理流
作用:把对象序列化到文件里
b、构造方法
new ObjectOutputStream(OuputStream out)
c、方法:
writeObject():把对象写到文件里
(5)注意:
a、要序列化的对象--》类一定要实现Serializable接口
Serializable接口仅仅只是一中标识,表示这个类的对象
可以被序列化的
否则异常:java.io.NotSerializableException:
b、类里的属性必须要全部可序列化(包含其他类)
c、对于瞬态属性(transient)不能被序列化的
d、静态的属性也是不能被序列化的(内存存储只有一份)
e、serialVersionUID 5832446596546430553
-1633153781288661891
作用:在反序列化时,检测文件里的类的信息和现在类的信息是不是
一致;如果不一致,就异常
一般:自己生成版本号,不要让系统自动生成
(6)反序列化
a、ObjectInputStream:对象输入流
b、分类:输入流 字节流 处理流
c、构造方法:
new ObjectInputStream(InputStream in)
d、方法
readObject():读取对象 (强转)
注意:
用Externalizable 的接口来Serailizable 的扩展除了能存对象信息还能存数组,字符串
实现Externalizable 的接口必须要复写writeExternal () 和readExternal() 的方法
才能有资格调用writeObject() 和readObject() 的方法,调用这两个方法
其实就是调用的writeExternal() 和readExternal()
可以根据需要定义除了对象别的数据形式。从这里说明了它是Serailizable的扩展
4、RandomAccessFile:随机读写文件流 :独立于IO体系之外的一个类
(1)作用:可以通过指针的移动来随机读取(写入)文件的任意位置的信息
可以写入(读取)java风格数据,读int 写一个double
(2)构造方法:
new RandomAccessFile(File file,String auth)//第二个参数表示权限
//权限有两种:r 可读 rw 可读可写
new RandomAccessFile(String path,String auth)
(3)方法:
seek(long position):移动指针, seek(4)
读取写入的时候从指针的后一个位置开始写入
getFilePointer:获取指针的位置
readInt():从指针的下一个位置开始读4个字节
readShort()...
writeInt():从指针的下一个位置写数据
5、包装者模式:是一种设计模式
单例模式:
工厂模式:
适配器模式:(忽略)
包装者模式:扩展类的功能,可以减少类的个数(相比于继承来说)
(1)顶层接口-----Goods接口
(2)最基础的实现类----Coffee
(3)装饰类-----DecoratorBean
(4)具体的装饰角色---牛奶 巧克力 香草.....
有一个商品对象,都有计算价格方式