`
java_mzd
  • 浏览: 583240 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

内存流

阅读更多

内存流在写通信的时候用过蛮多次了

可是每次看到李新华书上给内存流的定义

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>.
 *
 */

 

再稍微看下源码,就什么都明白了。

 

 

反正也写了这面久

就当做是给自己个机会总结总结加深理解吧。

分享到:
评论
2 楼 贾懂凯 2010-11-15  
API级别的程序,我觉得不需要看源码,只要看注释就够了。
1 楼 javafound 2010-11-03  
引用
代码里面是没有秘密

相关推荐

    Delphi 内存流数组合并成单一内存流

    Delphi 内存流数组合并成单一内存流,使用方法:1.多个图片、控件、窗体、无类型数组等转换成一个个内存流,2.利用本单元合并成一个内存流,3.保存成一个文件,4.调用时:由文件生成单一内存流,5.利用本单元分解成...

    C++内存流CMemoryStream

    C++内存流CMemoryStream是MFC(Microsoft Foundation Classes)库中的一个重要组件,它允许程序在内存中读写数据,从而实现类似与文件流的操作。内存流提供了一种高效、灵活的方式来处理内存中的数据,特别是在处理...

    一个内存流播放的例子.zip_delphi一个内存流播放的例子_内存_流播放

    在Delphi编程环境中,内存流(Memory Stream)是一种非常实用的数据结构,用于在内存中存储和操作数据。本文将深入探讨如何使用内存流来播放任意视频,这在处理媒体文件时能提供高效且灵活的解决方案。 内存流是...

    .Net MVC NPOI 返回内存流导出Excel

    在这个场景中,我们将探讨如何使用.NET MVC结合NPOI库来实现内存流方式导出Excel文件,以便用户可以点击下载。 首先,我们需要了解NPOI库的基本用法。NPOI提供了两个主要的接口:HSSFWorkbook(用于处理.xls格式的...

    FileStream MemoryStream 内存流 文件流 生成客户端

    这两个类是实现文件流和内存流的核心工具,广泛应用于各种场景,包括文件读写、数据传输以及在内存中的对象序列化和反序列化。 `FileStream`类是用于与磁盘上的文件进行交互的流类。它可以读取、写入或追加文件内容...

    JAVA_内存流

    Java 内存流是Java编程语言中用于处理内存对象的数据流。在Java中,I/O流主要用于处理磁盘、网络等外部数据源,而内存流则专注于在内存中的数据操作。内存流通常用于读写内存对象,如数组,提供了一种高效且灵活的...

    共享内存流TMapStream

    共享内存流TMapStream是一种在Delphi编程环境中用于高效处理大文件读写的机制。它通过映射文件到内存,使得程序可以直接对文件进行高速访问,而无需频繁地进行磁盘I/O操作,从而显著提高性能并减少假死现象。本文将...

    用内存流、文件流、资源生成客户端

    标题中的“用内存流、文件流、资源生成客户端”指的是在编程中利用内存流、文件流和资源管理技术来创建可执行的客户端程序。在 Delphi 这样的集成开发环境中,这种技术通常用于构建二进制文件,如EXE或DLL,而无需先...

    流和内存流进行转换

    内存流(Memory Stream)是流的一种特殊形式,它在内存中操作数据,而不需要与磁盘、网络或其他外部设备交互。本篇文章将深入探讨流和内存流的概念、它们之间的转换以及如何在实际应用中进行转换。 一、流的基本...

    Delphi内存流读写、删除、输入输出实例,将若干个流合并成一个流,可以对其进行读出添加删除操作以及输出为文件或流.zip

    在本文中,我们将深入探讨如何在Delphi编程环境中利用内存流进行读写、删除和输入输出操作。Delphi中的TMemoryStream类是一个非常强大的工具,它允许开发者在内存中存储和处理数据,而无需依赖磁盘文件。我们将通过...

    NPOI导出Excel文件(内存流操作下载)

    利用NPOI导出Excel文件,写入到内存流中,输出文件下载

    内存流与文件

    内存流和文件是计算机编程中两个重要的概念,特别是在处理数据传输和存储时。在本文中,我们将深入探讨如何将图片文件和文本文件转换为内存流,以及如何将内存流回写到相应的文件。 首先,内存流是编程中的一种抽象...

    Delphi内存流、文件流原理实例及应用.rar

    在Delphi编程环境中,内存流(Memory Stream)和文件流(File Stream)是两种非常重要的数据处理工具。它们主要用于在内存和磁盘之间传输数据,是实现数据序列化和反序列化的重要手段。本篇文章将深入探讨这两种流的...

    delphi 自定义结构数据通过内存流方式读取与保存到本地 TMemoryStream

    // 释放数组内存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 如何使用内存流操作无文件XML

    Visual C++源代码 155 如何使用内存流操作无文件XMLVisual C++源代码 155 如何使用内存流操作无文件XMLVisual C++源代码 155 如何使用内存流操作无文件XMLVisual C++源代码 155 如何使用内存流操作无文件XMLVisual ...

    一个内存流的合并添加删除读出输出的类(含DEMO)

    内存流在计算机编程中是一种非常重要的数据处理方式,特别是在Java、C#等编程语言中,它们提供了高效且灵活的数据操作接口。本主题聚焦于如何利用内存流进行数据的合并、添加、删除、读取和输出,同时附带了一个DEMO...

    一个内存流的合并添加删除读出输出的类 (含DEMO).rar_DEMO_内存

    内存流在计算机编程中是一种非常重要的数据处理方式,特别是在Java和.NET等面向对象的语言中,内存流被广泛用于处理内存中的数据。这个“一个内存流的合并添加删除读出输出的类 (含DEMO).rar_DEMO_内存”资源似乎...

    一个内存流的合并添加删除读出输出的类 (含DEMO)

    标题中的“一个内存流的合并添加删除读出输出的类 (含DEMO)”指的是一个用于处理内存流操作的自定义类,这个类可能包含了在内存中合并、添加、删除和读取输出数据流的功能。在Delphi编程环境中,内存流...

    delphi 利用内存流合并文件

    在Delphi编程环境中,利用内存流(Memory Stream)合并文件是一项常见的操作,特别是在处理大量数据或者需要高效读写文件的场景下。内存流允许我们直接在内存中存储和操作数据,而无需频繁地与磁盘交互,从而提高...

    使用内存流操作无文件XML 编程小实例

    本实例将探讨如何利用内存流(Memory Stream)操作无文件XML,从而避免频繁的磁盘I/O操作,提高程序性能。本文将深入讲解相关编程技巧,并附带C++.NET源代码供参考。 首先,理解XML的基础概念是必要的。XML...

Global site tag (gtag.js) - Google Analytics