彻底转变流,第1部分 - 编程入门网
彻底转变流,第1部分时间:2011-06-21 Merlin Hughes通常,Java I/O 框架用途极其广泛。同一个框架支持文件存取、网络访问、 字符转换、压缩和加密等等。不过,有时它不是十分灵活。例如,压缩流允许您 将数据写成压缩格式,但它们不能让您读取压缩格式的数据。同样地,某些第三 方模块被构建成写出数据,而没有考虑应用程序需要读取数据的情形。本文是两 部分系列文章的第一部分,Java 密码专家和作家 Merlin Hughes 介绍了使应用 程序从仅支持将数据写至输出流的源中有效读取数据的框架。 自早期基于浏览器的 applet 和简单应用程序以来,Java 平台已有了巨大的 发展。现在,我们有多个平台和概要及许多新的 API,并且还在制作的差不多有 数百种之多。尽管 Java 语言的复杂程度在不断增加,但它对于日常的编程任务 而言仍是一个出色的工具。虽然有时您会陷入那些日复一日的编程问题中,但偶 尔您也能够回过头去,发现一个很棒的解决方案来处理您以前曾多次遇到过的问 题。 就在前几天,我想要压缩一些通过网络连接读取的数据(我以压缩格式将 TCP 数据中继到一个 UDP 套接字)。记得 Java 平台自版本 1.1 开始就支持压 缩,所以我直接求助于 java.util.zip 包,希望能找到一个适合于我的解决方 案。然而,我发现一个问题:构造的类都适用于常规情况,即在读取时对数据解 压缩而在写入时压缩它们,没有其它变通方法。虽然绕过 I/O 类是可能的,但 我希望构建一个基于流的解决方案,而不想偷懒直接使用压缩程序。 不久以前,我在另一种情况下也遇到过完全相同的问题。我有一个 base-64 转码库,与使用压缩包一样,它支持对从流中读取的数据进行译码,并对写入流 中的数据进行编码。然而,我需要的是一个在我从流中读取数据的同时可以进行 编码的库。 在我着手解决该问题时,我认识到我在另一种情况下也遇到过该问题:当序 列化 XML 文档时,通常会循环遍历整个文档,将节点写入流中。然而,我遇到 的情况是需要读取序列化格式的文档,以便将子集重新解析成一个新文档。 回过头想一下,我意识到这些孤立事件表示了一个共性的问题:如果有一个 递增地将数据写入输出流的数据源,那么我需要一个输入流使我能够读取这些数 据,每当需要更多数据时,都能透明地访问数据源。 在本文中,我们将研究对这一问题的三种可能的解决方案,同时决定一个实 现最佳解决方案的新框架。然后,我们将针对上面列出的每个问题,检验该框架 。我们将扼要地谈及性能方面的问题,而把对此的大量讨论留到下一篇文章中。 I/O 流基础知识 首先,让我们简单回顾一下 Java 平台的基本流类,如图 1 所示。 OutputStream 表示对其写入数据的流。通常,该流将直接连接至诸如文件或网 络连接之类的设备,或连接至另一个输出流(在这种情况下,它称为 过滤器 (filter))。通常,输出流过滤器在转换了写入其中的数据之后,才将转换后 产生的数据写入相连的流中。 InputStream 表示可以从中读取数据的流。同样 ,该流也直接连接至设备或其它流。输入流过滤器从相连的流中读取数据,转换 该数据,然后允许从中读取转换后的数据。 图 1. I/O 流基础知识 就我最初的问题看, GZIPOutputStream 类是一个输出流过滤器,它压缩写 入其中的数据,然后将该压缩数据写入相连的流。我需要的输入流过滤器应该能 从流中读取数据,压缩数据,然后让我读取结果。 Java 平台,版本 1.4 已引入了一个新的 I/O 框架 java.nio 。不过,该框 架在很大程度上与提供对操作系统 I/O 资源的有效访问有关;而且,虽然它确 实为一些传统的 java.io 类提供了类似功能,并可以表示同时支持输入和输出 的双重用途的资源,但它并不能完全替代标准流类,并且不能直接处理我需要解 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |