Java对象流的简单使用
对象流(ObjectInputStream&ObjectOutputStream):
对象流和数据流差不多,和数据流的差别就是除了各种类型和字符串还支持对象。
(1)先写出后读取
(2)读取的顺序与写出顺序保持一致
步骤和数据流是一毛一样的。
注意:
(1)不是所有的对象都可序列化【何为序列化???下面有说明】,如果是我们自定义的类,想序列化的话,必须加上Serializable这个借接口。
(so,创建类时,要记得添加implements java.io.Serializable,不然会异常)
(2)如果类中的成员变量name是敏感信息,则可以使用transient关键字,该数据不需要序列化。
何为序列化???
Java提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。
总之:
序列化(对象转换为字节)
反序列化(字节重构为对象)
下面附上Java代码例子:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
/**
* 对象流(和数据流的差别就是除了各种类型和字符串还支持对象)
* 1,先写出后读取
* 2,读取的顺序与写出顺序保持一致
* 3,不是所有的对象都可序列化,如果是我们自定义的类,想序列化的话,必须加上Serializable这个借接口
* 序列化可以理解为对象输出流,反序列化可以理解为对象输入流
* ObjectInputStream
* ObjectOutputStream
* @author Administrator
*
*/
public class ObjectTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//写出-->序列化(假如我们写到字节数组里面)
//节点流(只要我们遇到了节点流,我们都要加上缓冲流,内部会提高他的性能)
ByteArrayOutputStream baos=new ByteArrayOutputStream();//需要用到新增方法,不发生多态
ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(baos));
//操作数据类型(将数据写到字节数据输出流里面,也就是节点流)
oos.writeUTF("编码辛酸泪");
oos.writeInt(18);
oos.writeBoolean(false);
oos.writeChar('a');
//对象
oos.writeObject("谁解其中味");//字符串也是对象
oos.writeObject(new Date());
Employee emp=new Employee("马云",400);
oos.writeObject(emp);
oos.flush();
byte[] datas=baos.toByteArray();//这是就是上面说的新增方法
//读取-->反序列化
//
ObjectInputStream ois=new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(datas)) );
//读取数据顺序与写出顺序保持一致
String msg=ois.readUTF();
int age=ois.readInt();
boolean flag=ois.readBoolean();
char ch=ois.readChar();
//对象的数据还原(还原为对象)
Object str=ois.readObject();
Object date=ois.readObject();
Object employee=ois.readObject();
//System.out.println(str);
if(str instanceof String) {
String strObj=(String)str;
System.out.println(strObj);
}
if(date instanceof Date) {
Date dateObj=(Date)date;
System.out.println(dateObj);
}
if(employee instanceof Employee) {
Employee empObj=(Employee)employee;
System.out.println(empObj.getName()+"-->"+empObj.getSalary());
}
System.out.println(msg+"--"+age+"--"+flag+"--"+ch);//编码辛酸泪--18--false--a
}
}
/**javabean封装数据
* 创建类时,要记得添加implements java.io.Serializable,不然会异常。
* 异常为java.io.NotSerializableException: Employee
*
*/
class Employee implements java.io.Serializable{
private transient String name;//如果name是敏感信息,则可以使用transient关键字,该数据不需要序列化
private double salary;
public Employee() {
}
public Employee(String name, double salary) {
super();
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}