DataOutputStream
和ByteArrayOutputStream
组合起来可以实现序列化,那么如何进行组合起来呢?
@Test
public void testDataOutputStreamAndDataInputStream() throws IOException {
ByteArrayOutputStream bOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream( bOutputStream );
String name = "ming";
int age = 2;
dataOutputStream.writeInt( 0 );
dataOutputStream.writeUTF( name );
dataOutputStream.writeInt( age );
dataOutputStream.writeLong( 4 );
byte[] bytes = bOutputStream.toByteArray();
ByteBuffer byteBuffer = ByteBuffer.wrap( bytes );
ByteArrayInputStream bInputStream = new ByteArrayInputStream( bytes );
DataInputStream dataInputStream = new DataInputStream( bInputStream );
dataInputStream.readInt();
String userName = dataInputStream.readUTF();
Integer userAge = dataInputStream.readInt();
Long longValueLong = dataInputStream.readLong();
System.out.println( "userName:" + userName );
System.out.println( "userAge: " + userAge );
System.out.println( " longValue:" + longValueLong );
}
我们可以看到将ByteArrayOutputStream
传入DataOutputStream
,就可以实现序列化,并且写入的顺序和读入的顺序必须一致,否则会出现错误。例如我们先写入一个int类型的数据,那么当我们读的时候也首先读出来一个int类型的数据。在ZooKeeper的序列化组件jute中就用到了ByteArrayOutputStream和DataOutputStream组合。
那么如何实现的?ByteArrayOutputStream是面向字节,当我们使用DataOutputStream可以面向java简单的数据类型,那么为什么会这样的,因为在DataOutputStream里面做了一个简单的转化,例如写入一个int的时候,就转化为4个字节然后依次写入。类似的 DataInputStream里面读取一个int的时候,然后连续读取4个字节,然后拼装成一个int。其他基本数据类型一样。