黑马程序员——IO包中的其他类
IO包中的其他类:
1.打印流:提供了打印方法,可以将各种数据类型的数据原样打印
字节打印流PrintStream
构造函数可以接受的参数类型:
(1)File对象 File
(2)字符串路径 String
(3)字节输出流 OutputStream
字符打印流PrintWriter
构造函数可以接受的参数类型:
(1)File对象 File
(2)字符串路径 String
(3)字节输出流 OutputStream
(4)字符输出流:Writer
2.SequenceInputStream(串联流)
用于把多个流中的数据写入一个流中,构造函数传入Enumeration<? extends InpuStream>
需要用到Vector
3.操作对象
ObjectInputStream,ObjectOutputStream
被操作的对象要实现Serializable(标记接口),
Serializable运行时使用一个称为serialVersionUID的版本号与每个可序列化类相关联,
次版本号根据类中的成员计算得出。。如果接受者加载该对象的类的serialVersionUID与对应的发送者的版本号不同,则
反序列化会导致InvalidClassException。可序列化类可以通过声明名为serialVersion的字段(该字段必须是静态,最终的long型字段)
显式声明自己的serialVersion,如此当改变类成员时,也可反序列化。
静态成员不会被序列化,因为只能序列化对中的数据,静态成员在方法区。
如果希望摸个成员不被序列化,可以用transient修饰,保证其值在对内存中存在,而不再文本文件中存在
分别使用readObject(Object) 和writeObject(Object)方法读取对象和持久化对象
4.管道流 PipedInputStream,PipedOutputStream
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。
不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程
。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。
如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏
5.RandomAccessFile :
该类不算是流体系中的子类,是直接继承自Object
但是他是IO包成员,因为它具备读写功能
内部封装了一个数组,而且通过指针对数组的元素进行操作
可以通过getFilePointer获取指针位置
同事可以通过seek改变指针位置
其实完成读写的原理是内部封装了字节输入流和输出流
通过其构造函数可以看出,该类只能操作文件,而且操作问价还有模式:
6.操作基本数据类型
DataInputStream,DataOutputStream
7.操作字节数组 :用流的读写思想来操作数组
ByteArrayInputStream:在构造的时候,需要接收数据员,而且数据源是一个字节数组
ByteArrayOutputStream:在构造的时候,不用定义数据目的地,因为该对象中内部已经封装了可变长度的字节数组
这就是数据目的地
因为这两个流对象都操作数组,并没有使用系统资源,所以不用close关闭
8.操作字符数组:CharArrayReader,CharArrayWriter
9.将字符流转对象化为字节流对象,使用转换流:InputStreamReader(字节通向字符的桥梁)
InputStreamReader isr=new InputStreamReader(new FileInputStream("gbk.txt"),"gbk")
OutputStreamWriter(字符通向字节的桥梁)
OutputStreamReader osr=new OutputStreamReader(new FileOutputStream("utf.txt"),"UTF-8")
10.编码:字符串变成字节数组 String>String new String(byte[],charsetName)
Tomcat的编码方式是iso8859-1
如果使用gbk编码方式存储了数据,取得时候解码用的是iso8859-1,
此时可以将解码出的数据再用iso8859-1进行编码得到原来的字节数据,然后再用gbk解码即可
但是如果期初是用utf-8解码而导致乱码,则不可逆转,因为gbk和utf-8均识别中文