对象的序列化
ObjectInputStream
ObjectOutputStream
流可以操作数据,现在把数据封装到对象中(Object),对象在堆内存中。
所以可以通过流将堆内存中的对象存到硬盘上。 即对象的持久化[对象的序列化]
![File-02 - 九五二七 - 今天](http://img0.ph.126.net/PJ-gI9DcnNK5wVqqIa6JNg==/6608262795028244304.png)
介绍几个有特点的方法:
writeObject()
![File-02 - 九五二七 - 今天](http://img0.ph.126.net/gc632coifl3flslyFvfNFg==/2848526764412764668.png)
![File-02 - 九五二七 - 今天](http://img1.ph.126.net/IACPpiUKs010x5dAXOeCCg==/858498679067906191.png)
![File-02 - 九五二七 - 今天](http://img2.ph.126.net/1_YwiPaEsmYKPl2UMl_9GQ==/6619471216560318458.png)
就是对象想要实现 ” 序列化 ” ,需要先实现接口 Serializable
![File-02 - 九五二七 - 今天](http://img1.ph.126.net/16jFJcQDBHPYvgPUiUYiuw==/858498679067906200.png)
接口Serializable内部没有方法。没有方法的接口称作标记接口
相当于在该对象盖个章,告知虚拟机可以序列化。
原理:UID值
静态是不能被序列化的。静态在方法区,该方法只能静态化堆内存中
非静态的不在方法区中,在堆内存中也不想被序列化的,可用关键字:transient奋斗
![File-02 - 九五二七 - 今天](http://img1.ph.126.net/a-iR2kivdPi6_FXlCVzp8A==/6619283200071968413.png)
transient: 短暂的 临时的。--trans转移 –ient…的[tranzi nt]
Stay Hungray Stay Foolish
管道流
正常读写流需要一个数组中转,先通过流读进数组,再通过流写出数组,
PipedInputStream和PipedOutputStream
输入输出可以直接进行连接,通过结合线程使用。
此方法不建议使单线程,无法判断先读还是先写,读多少,写多少.易产生死锁
集合中涉及到IO流的Properties(),IO流中涉及到多线程的是管道流
打分
RandomAccessFile
随机访问文件 RandomAccessFile
结尾处没有父类明,是自成一派的工具类。直接继承Object。
该类不是IO包体系中的子类。而是直接继承Object
但是它是IO包中的成员,因为它具备读与写功能
内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置。
同时可以通过seek改变指针的位置
操作数据必然是流,而RandomAccessFile可以操作数据
其实完成读写的原理就是内部封装了字节输入流和输出流
通过构造函数可以看出,该类只能操作文件。
而且操作文件还有模式:只读r,,读写rw等
![File-02 - 九五二七 - 今天](http://img0.ph.126.net/XPR5Z-Od5_KdkS3ar-w0vQ==/1140255130755774648.png)
![File-02 - 九五二七 - 今天](http://img1.ph.126.net/mS7Y1o5TQAtF_dnE3gdfaQ==/6619471216560318460.png)
就是只接收这4种字母,如wirte,abc格式错误不会接收
writeInt()方法:
![File-02 - 九五二七 - 今天](http://img2.ph.126.net/EKkv__v6f1pTLeZn6Vx1zQ==/6608443114934084855.png)
![File-02 - 九五二七 - 今天](http://img0.ph.126.net/NgPNKNCTQmoX8oJztT_deg==/6619165552327796484.png)
如果该文件不存在,则会出现异常。
如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。
RandomAccessFile通过与多线程,可以实现“多线程下载”。
IO流中只用该流可以实现多线程下载。
要注意:该流主要方法是seek(),使用seek()前提是存储要有规律。
DataStream.操作基本数据类型
写入不同类型数据:
![File-02 - 九五二七 - 今天](http://img0.ph.126.net/x7NA0JYHbmeRrLswnuFb6A==/6608851033747987863.png)
![File-02 - 九五二七 - 今天](http://img0.ph.126.net/hEyHHL4r76_N153m02lzvw==/1454944154718309654.png)
特殊方法:
writeUTF()
![File-02 - 九五二七 - 今天](http://img2.ph.126.net/7qfj12X93zD1R3eoInBZoA==/3763038963744998858.png)
ByteArrayStream
ByteArrayInputStream:
![File-02 - 九五二七 - 今天](http://img2.ph.126.net/6Njf8hSI_YxcHkcU2z3fMQ==/1858579271320943825.png)
不涉及到底层调用,所以不会产生任何IO异常。
.close()方法也就不起作用了。
ByteArrayOutputStream
![File-02 - 九五二七 - 今天](http://img1.ph.126.net/Z_YA9RDSBZSyaEHUkKAYCQ==/6608244103330572424.png)
![File-02 - 九五二七 - 今天](http://img1.ph.126.net/Rn-dzJi9I21B31AAjhuNZg==/3754031764490414143.png)
还有对应的操作字符数组:
CharArrayReader和ChaArrayWrite
操作字符串:
StringReader和StringWriter
06编码表
编码表:就是将各个国家的文字用数字表示,并一一对应,形成一张表。
常见编码表:![File-02 - 九五二七 - 今天](http://img0.ph.126.net/RnwBiKP0TwXNRYSDp55H9Q==/6619346971746379443.png)
![File-02 - 九五二七 - 今天](http://img2.ph.126.net/dQGOA0j-maYFwjm7zzL0wg==/6608461806631758098.png)
![File-02 - 九五二七 - 今天](http://img2.ph.126.net/yTRthb3zm0VuExpprwX2sw==/6608688306027079505.png)
str.getBytes(charsetName);
解码:字节数据变成字符串
new String(byte[],charsetName);
![File-02 - 九五二七 - 今天](http://img1.ph.126.net/O-3Kg4vfbRrKx70s6HEbSA==/6608582752910814331.png)
![File-02 - 九五二七 - 今天](http://img2.ph.126.net/22rVx6cnn4ADqtlRyS4Rbw==/6608803754747996168.png)