部分(5)
时间:2011-06-21 Merlin Hughes
I/O 流引擎
输出引擎解决了让我费力处理的问题,它是一个通过输出流过滤器将数据从 输入流复制到目标输出流的引擎。这满足了递增性的特性,因为它可以一次读写 单个缓冲区。
清单 5 到 10 中的代码实现了这样的一个引擎。通过输入流和输入流工厂来 构造它。清单 11 是一个生成过滤后的输出流的工厂;例如,它会返回包装了目 标输出流的 GZIPOutputStream 。
清单 5. I/O 流引擎
package org.merlin.io;
import java.io.*;
/**
* An output engine that copies data from an InputStream through
* a FilterOutputStream to the target OutputStream.
*
* @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 IOStreamEngine implements OutputEngine {
private static final int DEFAULT_BUFFER_SIZE = 8192;
private InputStream in;
private OutputStreamFactory factory;
private byte[] buffer;
private OutputStream out;
该类的构造器只初始化各种变量和将用于传输数据的缓冲区。
清单 6. 构造器
public IOStreamEngine (InputStream in, OutputStreamFactory factory) {
this (in, factory, DEFAULT_BUFFER_SIZE);
}
public IOStreamEngine
(InputStream in, OutputStreamFactory factory, int bufferSize) {
this.in = in;
this.factory = factory;
buffer = new byte[bufferSize];
}
在 initialize() 方法中,该引擎调用其工厂来封装与其一起提供的 OutputStream 。该工厂通常将一个过滤器连接至 OutputStream 。
清单 7. initialize() 方法
public void initialize (OutputStream out) throws IOException {
if (this.out != null) {
throw new IOException ("Already initialised");
} else {
this.out = factory.getOutputStream (out);
}
}
彻底转变流,第1部分(6)
时间:2011-06-21 Merlin Hughes
在 execute() 方法中,引擎从 InputStream 中读取一个缓冲区的数据,然 后将它们写入已封装的 OutputStream ;或者,如果输入结束,它会关闭 OutputStream 。
清单 8. execute() 方法
public void execute () throws IOException {
if (out == null) {
throw new IOException ("Not yet initialised");
} else {
int amount = in.read (buffer);
if (amount < 0) {
out.close ();
} else {
out.write (buffer, 0, amount);
}
}
}
最后,当关闭引擎时,它就关闭其 InputStream 。
清单 9. 关闭 InputStream
public void finish () throws IOException {
in.close ();
}
内部 OutputStreamFactory 接口(下面清单 10 中所示)描述可以返回过滤 后的 OutputStream 的类。
清单 10. 内部输出流工厂接口
public static interface OutputStreamFactory {
public OutputStream getOutputStream (OutputStream out)
throws IOException;
}
}
清单 11 显示将提供的流封装到 GZIPOutputStream 中的一个示例工厂:
清单 11. GZIP 输出流工厂
public class GZIPOutputStreamFactory
implements IOStreamEngine.OutputStreamFactory
|