IO包中的其他对象
一、 打印流
PrintStream:在OutputStream基础上提供了增强的功能,即可以方便地输出各种类型的数据(而不仅限于byte类型)的格式化表示形式。
构造方法:PrintStream可以作为节点流使用而直接关联到文件数据源,也可以作为处理流关联到其他的字节输出流并向其输出数据提供增强的功能。
PrintStream(File file)
PrintStream(String fileName)
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoFlush)
PrintStream的方法不抛IOException;而是在异常的情况下设置一个内部标志,可以通过成员方法checkError()测试此标志的值以表明是否出现异常。
System.out就是一个PrintStream类型的对象。
PrintWriter:和PrintStream相似,区别在于:作为处理流使用时,PrintStream只能封装OutputStream类型的字节输出流,而PrintWriter既可封装OutputStream,还能够封装Writer类型字符输出流并增强其功能。
构造方法:以接收四种类型的值。
1、字符串路径
File对象 (对于这两种类型的数据,还可以指定编码表,也就是字符集。)
OutputStream Writer (对于后两种类型的数据,可以指定自动刷新。注意:该自动刷新值为true时,只有三个方法可以用:println, printf, format)
//如果既要有自动刷新,又可执行编码。如何创建流对象?
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8"),true);
如果想要提高效率,还要使用打印方法。
PrintWriter pw = new PrintWriter(new BufferdWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8")),true);
操作基本数据类型的流对象
DataInputStream:属于处理流,它能够以一种与机器无关的方式,直接从底层字节输入流读取Java基本数据类型和String类型的数据。
public DataInputStream(InputStream);
FileInputStream fis=new FileInputStream(“a.txt”);
DataInputStream ds=new DataInputStream(fis);
常用方法
int readInt(); boolean readBoolean(); short readShort(); long readLong(); String readUTF();
DataOutputStream:能够直接将Java基本类型数据写出其他的字节输出流,随后可以使用DataInputStream输入流读取这些数据
构造方法 public DataOutputStream(OutputStream);
常用方法
writeInt(int):一次写入四个字节writeBoolean(boolean);
writeShort(short);
writeLong(long);
writeUTF(String);//按照utf-8修改版将字符数据进行存储,只能通过readUTF读取。
二、对象的序列化
1、序列化的本意是把并行数据转换成串行数据的处理过程。
对象序列化是指将对象的状态数据以字节流的形式进行处理,一般用于实现对象的持久性,即长久保持一个对象的状态并在需要时获取该对象的信息以重新构造一个状态完全相同的对象。
简单的说,对象的序列化可以理解为使用I/O“对象流”类型实现的对象读/写操作。---ObjectInputStream以及ObjectOutputStream
2、实例,实现对象序列化。
Employ类,属性包括name、age和dept,方法有构造方法、getter和setter方法以及showInfo方法
使用ObjectOutputStream对象的writeOjbect()将员工对象存入指定文件。该方法将内存中员工对象的状态信息(姓名、年龄和部门)以有序二进制流的形式输出到目标文件中。--对象序列化
对象序列化的主要任务:写出对象的状态信息,并遍历该对象对其他对象的引用,递归的序列化所有被引用到的其他对象,从而建立完整的序列化流。
使用ObjectInputStream对象的readObject()将文件中的员工信息读取出来。--反序列化。
该方法反序列化输入流中的下一个对象,遍历该对象中所有对其他对象的引用,并递归的反序列化这些引用对象。
注意的问题:并不是任何引用类型的对象都可以被序列化,只有实现了java.io.Serializable接口的类的对象才可以。--出于安全性考虑,因为一些封装敏感信息或时效性强的信息的类不建议支持序列化,以避免出现泄密或信息失效问题。
Serializable接口中实际上没有定义任何属性和方法,它只是起到标记性作用(标记接口)。
在Java的语言规范中规定,Serializable接口的实现类均应提供无参的构造方法,以供可能的反序列化操作、系统重建对象时自动调用。
类中的静态成员不会被序列化。
对应非静态的成员如果也不想被序列化,可以通过transient关键字修饰。
实例,序列化过程中的数据保护。
PipedInputStream和PipedOutputStream
SequenceInputStream
ByteArrayInputStream和ByteArrayOutputStream
CharArrayReader和CharArrayWriter
StringReader和StringWriter