内存流
内存流在写通信的时候用过蛮多次了
可是每次看到李新华书上给内存流的定义
ByteArrayInputStream主要完成将内容写入到内存中
ByteArrayOutputStream主要内存中数据输入
就觉得蛋疼无比
本来明白的也看糊涂了
哥,输出流到底是从内存中输出到哪去啊?输入流写入内存又到底是写在哪里啊?
本来自己都用过很多次了
看到他这个定义又混乱了,简直是蛋疼无比。
遂,决定总结一番
一。ByteArrayOutputStream 主要是将内存中的数据(还是觉得这个说法很蛋疼),换个说法主要是将我们自己设置的,要输出的数据,输出到某一块内存区域,然后我们可以通过 ByteArrayOutputStream 中的toByteArray()方法,得到一个字节数组,这个字节数组中存放的,就是我设置进去的数据
使用场景有:在远程通信自己设计的通信协议中,要将每一个具体的消息类打包发送,我们可以通过内存输出流,将所有信息输出到某个内存区域,再通过 toByteArray()得到一个字节数组,那么,我们只要发送这个字节数组就好了
/**
* 用Format对应格式中ImageIO默认参数把IMAGE打包成BYTE[]
* @param image
* @return
*/
private byte[] compressImage(BufferedImage image, String format) {
BufferedImage bImage = new BufferedImage(image.getWidth(null), image
.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics bg = bImage.getGraphics();
bg.drawImage(image, 0, 0, null);
bg.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(bImage, format, out);
} catch (IOException e) {
e.printStackTrace();
}
return out.toByteArray();
}
2.ByteArrayInputStream 内存输入流,所谓的将内容写入内存,其实就是将通过构造方法,传入一个字节数组,然后,我们就可以通过这个输入流一个字节一个字节(或者多个字节)的读取出我们需要的信息
使用场景,当我们接收到一个信息时,放入一个字节数组,然后将该数组放入内存输入流中,我们就可以按字节需要的方式读取这个数组了
示例代码
/**
* @param data
* 从输入流得到的数组
* @return 对应消息类对象
* @throws Exception
*/
public static MessageHead unpackMessage(byte[] data) throws Exception {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
data);
DataInputStream dataInputStream = new DataInputStream(
byteArrayInputStream);
int totallen = data.length + 4;
byte type = dataInputStream.readByte();
System.out.println("tyte----" + type);
int senderID = dataInputStream.readInt();
int reciverID = dataInputStream.readInt();
MessageHead message = new MessageHead();
message.setTotallen(totallen);
message.setType(type);
message.setSenderID(senderID);
message.setReciverID(reciverID);
if (type == Constance.MESSAGE_TYPE_REGREQUST) {
int userID = dataInputStream.readInt();
String password = readString(dataInputStream, 20);
RegRequestMessage msg = new RegRequestMessage();
copyHead(message, msg);
msg.setUserID(userID);
msg.setPassWord(password);
return msg;
}
return null;
}
后话,其实以上理解都很2B
人家都说代码里面是没有秘密的,
我们只要打开这两个类的源代码,
就能轻松发现
/**
* This class implements an output stream in which the data is
* written into a byte array. The buffer automatically grows as data
* is written to it.
* The data can be retrieved using <code>toByteArray()</code> and
* <code>toString()</code>.
* <p>
* Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in
* this class can be called after the stream has been closed without
* generating an <tt>IOException</tt>.
*/
/**
* A <code>ByteArrayInputStream</code> contains
* an internal buffer that contains bytes that
* may be read from the stream. An internal
* counter keeps track of the next byte to
* be supplied by the <code>read</code> method.
* <p>
* Closing a <tt>ByteArrayInputStream</tt> has no effect. The methods in
* this class can be called after the stream has been closed without
* generating an <tt>IOException</tt>.
*
*/
再稍微看下源码,就什么都明白了。
哎
反正也写了这面久
就当做是给自己个机会总结总结加深理解吧。
上一篇: 除夕有什么风俗
推荐阅读
-
C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
-
XmlReader 读取器读取内存流 MemoryStream 的注意事项
-
DDR5内存接口芯片去年已流片 澜起科技:今年完成量产版研发
-
Linux基于Live555从共享内存 获取rstp实时H264视频流并转发 附源码
-
Java之IO流进阶篇:内存流,打印流,对象流
-
内存输出流ByteArrayOutputStream
-
XmlReader 读取器读取内存流 MemoryStream 的注意事项
-
C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
-
Java之IO流进阶篇:内存流,打印流,对象流
-
JavaSE——数据类型流、内存流、打印流