DataInputStream,DataOutputStream主要用于基础Java数据类型数据的序列化/反序列化;将基本的Java数据类型数据与二进制字节相互转化;
例如,我们可以利用DataOutputStream.writeUTF(String s)方法,直接将一个String对象写入一个字节输出流中,之后再利用DataInputStream.readUTF()方法将String对象直接读取出来。简化了中间转换的操作。
注意:读取和写入的顺序应该一致,否则会导致错误的数据拆分。
- DataInputStream
public class DataInputStream
extends FilterInputStream
implements DataInput
从一个底层字节input stream中读取Java基础数据类型(byte char int double, .etc)的数据;
使用data output stream写入的数据可以使用data input stream读取;
- DataOutputStream
public class DataOutputStream
extends FilterOutputStream
implements DataOutput
向一个底层的字节output stream中写入Java基础数据类型(byte char int double, .etc)的数据;
使用data output stream写入的数据可以使用data input stream读取;
使用示例:
我们将首先创建一个内存(字符数组)输出流,用于向其中写入数据;然后利用DataOutputStream向其中直接写入基础数据类型的Java对象,之后再利用DataInputStream从其中直接读取出对应的Java对象;
package com.gof.io.test;import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;public class DataInputAndOutputApp {public static void main(String[] args){ByteArrayOutputStream baos = null;ByteArrayInputStream bais = null;DataOutputStream dos = null;DataInputStream dis = null;int n = 10;double d = 12.05;String str = "test string";try{// writebaos = new ByteArrayOutputStream();dos = new DataOutputStream(baos);dos.writeInt(n);dos.writeDouble(d);dos.writeUTF(str);dos.flush();// readbais = new ByteArrayInputStream(baos.toByteArray());dis = new DataInputStream(bais);System.out.println("The int is: " + dis.readInt());System.out.println("The double is: " + dis.readDouble());System.out.println("The String is: " + dis.readUTF());}catch (Exception e){e.printStackTrace();}finally{try{dis.close();dos.close();bais.close();baos.close();}catch (Exception e){e.printStackTrace();}}}
}
输出结果:
<span style="font-family:SimSun;"><span style="font-size:10px;">The int is: 10
The double is: 12.05
The String is: test string
</span></span>
如果调整readXXX操作的顺序,将得到错误的结果。