内存流在写通信的时候用过蛮多次了
可是每次看到李新华书上给内存流的定义
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>.
*
*/
再稍微看下源码,就什么都明白了。
哎
反正也写了这面久
就当做是给自己个机会总结总结加深理解吧。
分享到:
相关推荐
Delphi 内存流数组合并成单一内存流,使用方法:1.多个图片、控件、窗体、无类型数组等转换成一个个内存流,2.利用本单元合并成一个内存流,3.保存成一个文件,4.调用时:由文件生成单一内存流,5.利用本单元分解成...
C++内存流CMemoryStream是MFC(Microsoft Foundation Classes)库中的一个重要组件,它允许程序在内存中读写数据,从而实现类似与文件流的操作。内存流提供了一种高效、灵活的方式来处理内存中的数据,特别是在处理...
在Delphi编程环境中,内存流(Memory Stream)是一种非常实用的数据结构,用于在内存中存储和操作数据。本文将深入探讨如何使用内存流来播放任意视频,这在处理媒体文件时能提供高效且灵活的解决方案。 内存流是...
在这个场景中,我们将探讨如何使用.NET MVC结合NPOI库来实现内存流方式导出Excel文件,以便用户可以点击下载。 首先,我们需要了解NPOI库的基本用法。NPOI提供了两个主要的接口:HSSFWorkbook(用于处理.xls格式的...
这两个类是实现文件流和内存流的核心工具,广泛应用于各种场景,包括文件读写、数据传输以及在内存中的对象序列化和反序列化。 `FileStream`类是用于与磁盘上的文件进行交互的流类。它可以读取、写入或追加文件内容...
Java 内存流是Java编程语言中用于处理内存对象的数据流。在Java中,I/O流主要用于处理磁盘、网络等外部数据源,而内存流则专注于在内存中的数据操作。内存流通常用于读写内存对象,如数组,提供了一种高效且灵活的...
共享内存流TMapStream是一种在Delphi编程环境中用于高效处理大文件读写的机制。它通过映射文件到内存,使得程序可以直接对文件进行高速访问,而无需频繁地进行磁盘I/O操作,从而显著提高性能并减少假死现象。本文将...
标题中的“用内存流、文件流、资源生成客户端”指的是在编程中利用内存流、文件流和资源管理技术来创建可执行的客户端程序。在 Delphi 这样的集成开发环境中,这种技术通常用于构建二进制文件,如EXE或DLL,而无需先...
内存流(Memory Stream)是流的一种特殊形式,它在内存中操作数据,而不需要与磁盘、网络或其他外部设备交互。本篇文章将深入探讨流和内存流的概念、它们之间的转换以及如何在实际应用中进行转换。 一、流的基本...
在本文中,我们将深入探讨如何在Delphi编程环境中利用内存流进行读写、删除和输入输出操作。Delphi中的TMemoryStream类是一个非常强大的工具,它允许开发者在内存中存储和处理数据,而无需依赖磁盘文件。我们将通过...
利用NPOI导出Excel文件,写入到内存流中,输出文件下载
内存流和文件是计算机编程中两个重要的概念,特别是在处理数据传输和存储时。在本文中,我们将深入探讨如何将图片文件和文本文件转换为内存流,以及如何将内存流回写到相应的文件。 首先,内存流是编程中的一种抽象...
在Delphi编程环境中,内存流(Memory Stream)和文件流(File Stream)是两种非常重要的数据处理工具。它们主要用于在内存和磁盘之间传输数据,是实现数据序列化和反序列化的重要手段。本篇文章将深入探讨这两种流的...
// 释放数组内存end;========================var ch1: array[0..47] of Char; str1: string;begin // 假设 ch1 已被赋值 str1 := StrPas( ch1);end;type Re_TodayData = record ArrToday: array[0..47] of Integer...
Visual C++源代码 155 如何使用内存流操作无文件XMLVisual C++源代码 155 如何使用内存流操作无文件XMLVisual C++源代码 155 如何使用内存流操作无文件XMLVisual C++源代码 155 如何使用内存流操作无文件XMLVisual ...
内存流在计算机编程中是一种非常重要的数据处理方式,特别是在Java、C#等编程语言中,它们提供了高效且灵活的数据操作接口。本主题聚焦于如何利用内存流进行数据的合并、添加、删除、读取和输出,同时附带了一个DEMO...
内存流在计算机编程中是一种非常重要的数据处理方式,特别是在Java和.NET等面向对象的语言中,内存流被广泛用于处理内存中的数据。这个“一个内存流的合并添加删除读出输出的类 (含DEMO).rar_DEMO_内存”资源似乎...
标题中的“一个内存流的合并添加删除读出输出的类 (含DEMO)”指的是一个用于处理内存流操作的自定义类,这个类可能包含了在内存中合并、添加、删除和读取输出数据流的功能。在Delphi编程环境中,内存流...
在Delphi编程环境中,利用内存流(Memory Stream)合并文件是一项常见的操作,特别是在处理大量数据或者需要高效读写文件的场景下。内存流允许我们直接在内存中存储和操作数据,而无需频繁地与磁盘交互,从而提高...
本实例将探讨如何利用内存流(Memory Stream)操作无文件XML,从而避免频繁的磁盘I/O操作,提高程序性能。本文将深入讲解相关编程技巧,并附带C++.NET源代码供参考。 首先,理解XML的基础概念是必要的。XML...