一、对象的序列化、持久化。
将java的对象的基本数据类型和图形存入文件中,实现对象数据的序列化和持久化。
操作对象可以使用: ObjectOutPutStream 和 ObjectInPutStream ,
而被操作的对象: 必须实现 Serializable 接口(标记接口)
ObjectOutPutStream:
构造方法: ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。
一般方法:void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
该方法用于向文件中写入对象数据,与ObjectInputStream的 readObject方法配套使用。
另有其他存入各种数据的方法(与基本数据类型流同),和继承自OutputStream的方法,自行查阅文档。
ObjectInputStream:
构造方法: ObjectInputStream(InputStream in)创建读取指定 InputStream 的 objectInputStream。
一般方法: Object readObject() 从 ObjectInputStream 读取对象。
该方法用于从文件中读取对象数据,与ObjectOutputStream的 writeObject方法配套使用。
另有其他取出各种数据的方法(与基本数据类型流同),和继承自OutputStream的方法,自行查阅文档。
Serializable
一个标记接口,只有实现了该接口的类的对象才拥有被序列化,持久化的能力。该接口没有扩展功能。
实现了该接口的类,其中的静态成员也不能被序列化。
对于实现了该接口,其中有非静态,但是又不想被持久化的成员,我们可以使用 transient 关键字修饰它。
该接口通过类中的成员来计算一个标记值,成员有任何改动都会改变这个值,类和其对象都被该值标记,只有标记值相同的才能认为是对象属于该类。
我们可以使用在类中 (ANY-ACCESS-MODIFIER) static final long serialVersionUID = 42L; 来给成员修饰符固定一个标记值,此时成员的修饰符的
改变不再影响最终标记值的数值。使得我们对类的成员修饰符做了一定改动后,依然可以通过该类识别器原先固化的对象。
二、管道流。
输入输出可以相互连接的流。通常由一个线程的 PipedInputStream读取数据(从管道),之后由另一个流的 PipedOutputStream 输出数据(到管道),
如果两个流在同一个对象中存在,容易发生阻塞。
PipedInputStream
构造方法: PipedInputStream() 创建尚未连接的 PipedInputStream
PipedInputStream(PipedOutputStream pout)创建 PipedInputStream,使其连接到管道输出流 pout。
连接方法: void connect(PipedOutputStream src) 使此管道输入流连接到管道输出流 src。
其他方法: int available() 返回可以不受阻塞地从此输入流中读取的字节数 。
PipedOutputStream
构造方法: PipedOutputStream() 创建尚未连接的 PipedOutputStream
PipedOutputStream(PipedInputStream pin)创建PipedOutputStream,使其连接到管道输出流 pin。
连接方法: void connect(PipedInputStream pin) 使此管道输入流连接到管道输出流 in。
他们都是字节输入输出流的子类,其可以使用InputStream 和 OutputStream的共性方法。
三、RandomAccessFile类
该类可以根据构造函数传入的参数不同实现同时对文件进行读写功能,并能以字节的形式访问文件中的指定位置(类似于将文件看做一个大型的byte数组,
从第一个字节开始排列(一个汉子两个字节,字母一个字节,按照gbk排列))。
该类不是io体系中的成员,其内部已经封装了输入输出字节流,
构造函数: RandomAccessFile(File file, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定
参数 mode为 r表示只读, 为rw表示读写。
RandomAccessFile(String fileName, String mode)创建一个随机读取文件流,文件本身有fileName指定。
参数 mode为 r表示只读, 为rw表示读写。
当只传入r的时候,代表流对象为只读对象,此时传入的文件必须是存在的文件。否则会有异常。
当传入参数为rw时,代表流对象为读写对象,此时文件若存在则指向该文件,否则创建一个该文件(不会覆盖)
其他方法: 其基本read,write,close方法与FileInputStream和FileOutputStream相同。
int readInt() 从此文件读取一个有符号的 32 位整数。 (另有对应其他基本数据类型的相关方法)。
String readLine() 从此文件读取文本的下一行。
void writeInt(int v) 按四个字节将 int 写入该文件,先写高字节。(另有相对应的其他数据类型方法)。
int skipBytes(int n) 尝试跳过输入的 n 个字节以丢弃跳过的字节。
long getFilePointer() 返回此文件中的当前偏移量。(即当前指针位置。)
void seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
(此方法方便常用,重点掌握)。此方法配合写入方法,可以修改文件局部内容。
此方法配合读取方法可以获取文件局部内容。
四、基本数据类型流
专门进行基本数据类型操作的流。
DateOutputStream:
构造方法: DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流
特有方法: int size() 返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数
void writeInt(int v) 将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
存入一个int数据,类似方法还有对: short,float,double,boolean
dyte,char,long 等所有基本数据类型, 和String 的操作方法。
void writeUTF(String str) 以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
使用该方法存入的数据必须使用 readUTF()方法读取。
注意:类ObjectOutputStream、 RandomAccessFile也具有上述除 size以外的所有功能。
DateInputStream:
构造方法:DateInputStream(InputStream in) 创建一个新的数据输入流,从指定基础输入流中读取数据。
特有方法:
int readInt() 读入一个int类型的值,就是读取四个字节。
读取一个int数据,类似方法还有对: short,float,double,boolean
dyte,char,long 等所有基本数据类型, 和String 的操作方法。
void readUTF() 以与机器无关方式使用 UTF-8 修改版编码从一个基础输入流中读取字符串。
该方法必须读取的是使用 writeUTF方法写入的数据。
注意: 类ObjectInputStream、 RandomAccessFile也具有上述全部功能。
注意: 使用读取类型的方法的顺序,必须与写入该文件的方法顺序相同,否则会读取失败。
五、ByteArrayStream
此类流的源和目的都是数组,没有涉及到系统底层资源, 该类没有close方法。
ByteArrayInputStream: 该流对象在建立的时候,需要接收一个数据源,该源是一个字节数组。
ByteArrayOutputStream: 该流对象在建立的时候,不需要指定数据目的,因为该对象内部封装了一个可变长度的byte数组。
特有方法: void reset() 将此 byte 数组输出流的 count 字段重置为零,从而丢弃输出流中目前已累积的所有输出。
int size() 返回缓冲区的当前大小。
void writeTo(OutputStream out) 将此 byte 数组输出流的全部内容写入到指定的输出流参数中,
这与使用 out.write(buf, 0, count) 调用该输出流的 write 方法效果一样。(此方法涉及异常)
其他方法与基本字节流 基本相同。
另外: 有CharArrayReader和CharArrayWriter,
StringReader 和 StringWriter
都是相应的源和目的都是内存的输入输出流,方法功能大致与字节数组流相当。