岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> J2EE >> J2ee核心 >> Java正文
Java数据流——企业级数据流分析(组图)
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-22 18:49:09

  输入输出流的概念在Java 1.0中首次被引入。与多媒体流不同,Java数据流以一种标准的方式进行工作,将数据写入目的地和从源读取数据。如:文件,套接字,甚至键盘和屏幕(System.in和System.out)都是作为可以用输入输出流进行通讯的源和目的的普通的例子。实际上,一些对象,如套接字,可以同时既是目的也是源。
  
  Java消息服务是企业级应用在一个分布式的环境中相互通讯的标准方式。虽然这是一个众所周知并大量验证的方法,但是它是复杂的和有时显得很笨重的消息驱动框架,它缺少了一些简单的流框架就可以提供的能力。MantaRay,一个开源的数据消息项目(JMS提供者),基于点对点,无服务端的架构,它通过融合了JMS和数据流两者的优点来解决上述的问题。
  
  这篇文章将会讨论隐藏在流概念中的能力和由MantaRay开源项目开发的企业级数据流,一种新型的流,它的目的地和源是JMS的topic和queue。
  
  输入输出流的能力
  
  概括

  
  流的最重要的能力特性在于,无论目的和源是什么,通讯API始终保持一致。写入一个套接字和写入一个文件是一样的。一个FileOutputStream对象可以专门为文件的操作提供额外的功能,但基础的读写仍然是一样的。结果是如果你不使用额外的功能,那么你就可以简单的替换掉源/目的而不需要改变你的代码。
  
  图1显示了流是如何使用的
  
 
  图1.使用流

  
  针对每种目的的流API是相同的和很原始的。举例,InputStream类的read()方法的返回值是一个在0-255之间的int。出于这个原因,Java提供了一组写入这些流更多复杂数据的工具。这些工具包括像writer和reader这样的帮助类,也有包装原始流的包装流。这些工具将在下一节讨论。
  
  流交换和改变
  
  另一个强大的特性是在一个流之上包装另一个流。如果你想写数据到一个文件但希望数据是被压缩的,你只需简单地创建一个FileOutputStream对象并将它包装在一个ZipOutputStream对象内。然后你写数据到ZipOutputSream,它会压缩数据并将它传递给FileOutputStream,它会将其写入到一个物理文件中。类似的,你可以使用FileInputStream和ZipInputStream对象从一个.zip文件中读出内容。
  
  实际上,你可以将多个流链接起来。比如,你可将一个SocketOutputStream包装在一个CipherOutputStream对象内用来加密数据,再包装在一个ZipInputStream对象内用来压缩数据。当数据从一个流传递到另一个流时, 每一个对象都在数据上进行自己的操作。
  
  图2显示了包装流的一个例子
  
 
  图2.包装流

  
  MantaRay的企业级流
  
  为什么需要企业级流?

  
  与大多数流工作于物理的IO组件不同,MantaRay企业级流工作于JMS的队列(queue)和主题(topic)之上。JMS是通过队列和主题传递消息的一个面向消息的标准,通常用在企业级应用环境中。
  
  举例来说,让我们看看两个想通过队列来进行通讯的应用。一个应用向队列中发送一条消息,另一个应用则接收这条消息。下面的代码演示了这一过程,使用JMS 1.02实现。
  
  // 发送代码:javax.jms.QueueConnectionFactory conFactory = new
  ...
  // look up in JNDI or create an instance
  // 在JNDI中查找或创建一个实例javax.jms.QueueConnection con
  = conFactory.createQueueConnection();
  // 创建一个非事务的自动确认的sessionjavax.jms.QueueSession sendSession
  = con.createQueueSession(false
  ,Session.AUTO_ACKNOWLEDGE);javax.jms.Queue sendQueue
  = sendSession.createQueue (sQueue);javax.jms.QueueSender sender
  = sendSession.createSender(sendQueue);javax.jms.TextMessage msg
  = sendSession.createTextMessage();msg.setText( "some text" );sender.send( msg,
  javax.jms.DeliveryMode.NON_PERSISTENT,
  javax.jms.Message.DEFAULT_PRIORITY,MESSAGE_TTL);
  // 接收代码:javax.jms.QueueConnectionFactory conFactory = new ...
  // 在JNDI中查找或创建一个实例javax.jms.QueueConnection con
  = conFactory.createQueueConnection();
  // 创建一个非事务的自动确认的sessionjavax.jms.QueueSession receiveSession
  = con.createQueueSession(false
  ,Session.AUTO_ACKNOWLEDGE);javax.jms.Queue receiveQueue
  = receiveSession.createQueue (rQueue);javax.jms.QueueReceiver qReceiver
  = receiveSession.createReceiver(receiveQueue);javax.jms.TextMessageMessage
  =(TextMessageMessage) qReceiver.receive();
  
  正如你所看到的,不仅代码有点复杂,而且它也是面向消息而非面向流的。当一个用户向企业级流中写入数据时,流会将数据剪切成包并将他们包装到一个JMS消息中。然后将消息发送到预设的队列或主题中,那里消息将被作为输入流处理,解包数据,并为目的端用户作好读取的准备。
  
  图3 显示了数据是如何在MantaRay企业级流中被处理的。
  
 
  图3.MantaRay企业级流中数据处理的过程

  
  因为企业级流扩展了InputStream和OutputStream对象,就象一个套接字或文件的Input/OutputStream做的那样,你可以将它们像流一样使用,从而释放出流所特有的能力。
  
  ·因为提供了所有流可以共享的接口,所以它们使用起来非常简单。
  ·你可将它们与其它流包装在一起从而获得如压缩和加密那样的扩展功能。
  ·你不用担心将数据拆分包,缓存的分配或其它的低层次的针对数据传递的问题
  
  使用企业级流
  
  JM

[1] [2] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365