进行编码的 OutputStreamWriter 进行写操作。
清单 20. 读取编码的字符数据
package org.merlin.io;
import java.io.*;
/**
* An output engine that copies data from a Reader through
* a OutputStreamWriter 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 ReaderWriterEngine implements OutputEngine {
private static final int DEFAULT_BUFFER_SIZE = 8192;
private Reader reader;
private String encoding;
private char[] buffer;
private Writer writer;
该类的构造器接受要从中读取的字符流、要使用的编码以及可选的缓冲区大 小。
清单 21. 构造器
public ReaderWriterEngine (Reader in, String encoding) {
this (in, encoding, DEFAULT_BUFFER_SIZE);
}
public ReaderWriterEngine
(Reader reader, String encoding, int bufferSize) {
this.reader = reader;
this.encoding = encoding;
buffer = new char[bufferSize];
}
彻底转变流,第1部分(12)
时间:2011-06-21 Merlin Hughes
当该引擎初始化时,它将以所选编码格式写字符的 OutputStreamWriter 连 接至提供的输出流。
清单 22. 初始化输出流写程序
public void initialize (OutputStream out) throws IOException {
if (writer != null) {
throw new IOException ("Already initialised");
} else {
writer = new OutputStreamWriter (out, encoding);
}
}
当执行该引擎时,它从输入字符流中读取数据,然后将它们写入 OutputStreamWriter ,接着 OutputStreamWriter 将它们以所选的编码格式传 递给相连的输出流。至此,该框架使数据可供读取。
清单 23. 读取数据
public void execute () throws IOException {
if (writer == null) {
throw new IOException ("Not yet initialised");
} else {
int amount = reader.read (buffer);
if (amount < 0) {
writer.close ();
} else {
writer.write (buffer, 0, amount);
}
}
}
当引擎执行完时,它关闭其输入。
清单 24. 关闭输入
public void finish () throws IOException {
reader.close ();
}
}
在这种与压缩不同的情况中,Java I/O 包不提供对 OutputStreamWriter 之 下的字符编码类的低级别访问。因此,这是在 Java 平台 1.4 之前的发行版上 读取编码格式的字符流的唯一有效解决方案。从版本 1.4 开始, java.nio.charset 包确实提供了与流无关的字符编码和译码能力。然而,这个 包不能满足我们对基于输入流的解决方案的要求。
彻底转变流,第1部分(13)
时间:2011-06-21 Merlin Hughes
应用工程解决方案:读取序列化的 DOM 文档
最后,让我们研究该框架的最后一种用法。清单 25 到 29 中的代码提供了 一个用来读取序列化格式的 DOM 文档或文档子集的解决方案。这一代码的潜在 用途可能是对部分 DOM 文档执行确认性重新解析。
清单 25. 读取序列化的 DOM 文档
package org.merlin.io;
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import org.w3c.dom.traversal.*;
/**
* An output engine that serializes a D
|