(一)定义
DataInputStream
能够以一种与机器无关的方式,直接从底层字节输入流读取java的基本类型和String类型的数据,为包裹流;
DataOutputStream
能够以一种与机器无关的方式,直接将java的基本类型和String类型数据写出到其它的字节输出流,为包裹流;
(二)常用方法
DataInputStream
构造方法:public DataInputStream(InputStream in);
普通方法:public final 数据类型 read首字符大写数据类型();
DataOutputStream
构造方法:public DataOutputStream(OutputStream in);
普通方法:public final 数据类型 write首字符大写数据类型();
public class TestData
{
public static void main(String args[]) throws Exception
{
long n = 9876543210L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//public ByteArrayOutputStream(): 创建一个新的 byte 数组输出流。缓冲区的容量最初是 32 字节,如有必要可增加其大小。
//执行后在内存中生成了一个大小为32个字节的byte数组并有一根叫做baos的管道已链接到了该byte数组中,并且可以通过这个管道向该byte数组中写入数据
//虽然此时可以通过baos向baos所连接到的在内存中分配好的byte数组中写入数据,但是ByteArrayOutputStream流并没有提供可以直接把long类型数据直接写入ByteArrayOutputStream流所连接到的byte数组中的方法,
//简单说我们没法通过baos向baos所连接到的byte数组中写入long类型的数据, 查API文档可以发现: ByteArrayOutputStream流中并没有类似writeLong()这样的方法,但是DataOutputStream流中却有writeLong() writeFloat()等方法
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n);
dos.flush();
byte[] buf = baos.toByteArray();
//DataOutputStream 流中并没有toByteArray()方法,但是ByteArrayOutputStream 流中却有toByteArray()方法, 所以不可以把baos 改为dos,否则编译时会出错! ByteArrayOutputStream流中toByteArray()方法的含义,摘自API“创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中”
//利用ByteArrayInputStream 和 DataInputStream 可以从byte数组中得到原long类型的数值10000L
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
long l = dis.readLong();
System.out.println("l = " + l);
dos.close();
}
}
输出:9876543210