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{
// write
baos = new ByteArrayOutputStream();
dos = new DataOutputStream(baos);
dos.writeInt(n);
dos.writeDouble(d);
dos.writeUTF(str);
dos.flush();
// read
bais = 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操作的顺序,将得到错误的结果。