快速业务通道

彻底转变流,第1部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
{   public OutputStream getOutputStream (OutputStream out)     throws IOException {    return new GZIPOutputStream (out);   } }

该 I/O 流引擎及其输出流工厂框架通常足以支持大多数的输出流过滤需要。

彻底转变流,第1部分(7)

时间:2011-06-21 Merlin Hughes

输出引擎输入流

最后,我们还需要一小段代码来完成这个解决方案。清单 12 到 16 中的代 码提供了读取由输出引擎所写数据的输入流。事实上,这段代码有两个部分:主 类是一个从内部缓冲区读取数据的输入流。与此紧密耦合的是一个输出流(如清 单 17 所示),它把输出引擎所写的数据填充到内部读缓冲区。

主输入流类将用其内部输出流来初始化输出引擎。然后,每当它的缓冲区为 空时,它会自动执行该引擎来接收更多数据。输出引擎将数据写入其输出流中, 这将重新填充输入流的内部缓冲区,以允许需要内部缓冲区数据的应用程序高效 地读取数据。

清单 12. 输出引擎输入流

package org.merlin.io; import java.io.*; /** * An input stream that reads data from an OutputEngine. * * @author Copyright (c) 2002 Merlin Hughes <merlin@merlin.org> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. */ public class OutputEngineInputStream extends InputStream {   private static final int DEFAULT_INITIAL_BUFFER_SIZE = 8192;   private OutputEngine engine;   private byte[] buffer;   private int index, limit, capacity;   private boolean closed, eof;

该输入流的构造器获取一个输出引擎以从中读取数据和一个可选的缓冲区大 小。该流首先初始化其本身,然后初始化输出引擎。

清单 13. 构造器

public OutputEngineInputStream (OutputEngine engine) throws IOException {   this (engine, DEFAULT_INITIAL_BUFFER_SIZE); } public OutputEngineInputStream (OutputEngine engine, int initialBufferSize)    throws IOException {   this.engine = engine;   capacity = initialBufferSize;   buffer = new byte[capacity];   engine.initialize (new OutputStreamImpl ()); }

彻底转变流,第1部分(8)

时间:2011-06-21 Merlin Hughes

代码的主要读部分是一个相对简单的基于字节数组的输入流,与 ByteArrayInputStream 类非常相似。然而,每当需要数据而该流为空时,它都 会调用输出引擎的 execute() 方法来重新填写读缓冲区。然后,将这些新数据 返回给调用程序。因而,这个类将对输出引擎所写的数据反复读取,直到它读完 为止,此时将设置 eof 标志并且该流将返回已到达文件末尾的信息。

清单 14. 读取数据

private byte[] one = new byte[1];   public int read () throws IOException {    int amount = read (one, 0, 1);    return (amount < 0) ? -1 : one[0] & 0xff;   }   public int read (byte data[], int offset, int length)     throws IOException {    if (data == null) {     throw new NullPointerException ();    } else if     ((offset < 0) || (length < 0) || (offset + length > data.length)) {     throw new IndexOutOfBoundsException ();    } else if (closed) {     throw new IOException ("Stream closed");    } else {     while (index >= limit) {      i

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号