DataOutputStream、DataInputStream、ByteArrayOutputStream、ByteArrayInputStream简介

ByteArrayOutputStream是向内存中写入流数据
ByteArrayInputStream是从内存中如数据
例如:
ByteArrayInputStream arrayInputStream =new ByteArrayInputStream("连".getBytes());
这就从内存中读取流数据;
然后用read方法就可以读出数据了;
同样的道理
ByteArrayOutputStream arrayOutputStream =new ByteArrayOutputStream();
arrayOutputStream.write(97);
arrayOutputStream.write(98);
byte[] bs =arrayOutputStream.toByteArray();
可以像内存中写数据,通过arrayOutputStream.toByteArray();获取到写的数据

然后引入了DataOutputStream、DataInputStream;
他们的作用就是格式化。因为我们的流操作的都是byte字节。这种可读性很差的。
而DataOutputStream、DataInputStream提供了很多读取数据的方法
如in.readUTF()、in.readInt()。。。。
下面是一个例子,把“连”写入到内存中

ByteArrayOutputStream arrayOutputStream =new ByteArrayOutputStream();
DataOutputStream out =new DataOutputStream(arrayOutputStream);
out.writeUTF("连");

byte[] bs =arrayOutputStream.toByteArray();
然后我们通过数据取到的是
0
3
-24
-65
-98
后三位是"连"的utf-8编码。前两位我也不知道是什么,第二位好像是字节数,如果两个字的话就是6.(好像是)
但是:
ByteArrayInputStream arrayInputStream =new ByteArrayInputStream("连".getBytes());
DataInputStream in =new DataInputStream(arrayInputStream);

System.out.println(in.readUTF());
就会出错。主要原因为我认为这样写  流的源里面没有 0 和3。于是我改进如下:
byte[] bs1 ={0,3,-24,-65,-98};
ByteArrayInputStream arrayInputStream =new ByteArrayInputStream(bs1);
DataInputStream in =new DataInputStream(arrayInputStream);

System.out.println(in.readUTF());
完全就没有问题了。
看来真是这个原因。

还有一个问题就是:
ByteArrayOutputStream arrayOutputStream =new ByteArrayOutputStream();
DataOutputStream out =new DataOutputStream(arrayOutputStream);
out.writeInt(1200);

byte[] bs =arrayOutputStream.toByteArray();
for(byte b:bs)
{
System.out.println(b);
}
打印结果是
0
0
4
-80
这里打印出来的是16进制
也就是4*(16^2)+(256-80)=1024+176=1200

原文地址:https://www.cnblogs.com/qingblog/p/2550811.html