下面的代码试图简化使用EXIficient执行EXI压缩和解压缩所需的设置
class ExiCompressionUtils {
static Transformer transformer = TransformerFactory.newInstance().newTransformer()
static byte[] compress(String xml) {
ByteArrayOutputStream exiOS = new ByteArrayOutputStream()
EXIResult exiResult = new EXIResult(outputStream : exiOS)
XMLReader xmlReader = XMLReaderFactory.createXMLReader()
xmlReader.contentHandler = exiResult.handler
xmlReader.parse(new InputSource(new StringReader(xml)))
def compressed = exiOS.toByteArray()
exiOS.close()
return compressed
}
static String extract(byte[] compressed) {
SAXSource exiSource = new SAXSource(new InputSource(new ByteArrayInputStream(compressed)))
exiSource.setXMLReader(exiSource.reader)
ByteArrayOutputStream exiOS = new ByteArrayOutputStream()
transformer.transform(exiSource, new StreamResult(exiOS)) // fails here
def extracted = exiOS.toString()
exiOS.close()
return compressed
}
}下面的测试使用ERROR: 'Invalid byte 1 of 1-byte UTF-8 sequence.'失败
@Test
void testExiCompression() {
def xml = '<Root><Child id="1">Text</Child><EmptyTag/></Root>'
def compressed = ExiCompressionUtils.compress(xml)
assert ExiCompressionUtils.extract(compressed) == xml
} 有没有编码专家能搞清楚这件事?
发布于 2017-04-04 14:52:34
今天,我为这条评论而苦苦挣扎。这段代码有一个重要的问题(除了Java奇怪的语法、缺少分号等)。
在阅读时,使用EXISource而不是SAXSource!
附加了一段工作正常的代码。
--丹尼尔
static Transformer transformer;
static {
try {
transformer = TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException e) {
} catch (TransformerFactoryConfigurationError e) {
}
}
static byte[] compress(String xml) throws IOException, EXIException,
SAXException {
ByteArrayOutputStream exiOS = new ByteArrayOutputStream();
EXIResult exiResult = new EXIResult();
exiResult.setOutputStream(exiOS);
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(exiResult.getHandler());
xmlReader.parse(new InputSource(new StringReader(xml)));
byte[] compressed = exiOS.toByteArray();
exiOS.close();
return compressed;
}
static String extract(byte[] compressed) throws TransformerException,
IOException, EXIException {
// SAXSource exiSource = new SAXSource(new InputSource(new
// ByteArrayInputStream(compressed))); // use EXISource instead!
SAXSource exiSource = new EXISource();
exiSource.setInputSource(new InputSource(new ByteArrayInputStream(
compressed)));
ByteArrayOutputStream exiOS = new ByteArrayOutputStream();
transformer.transform(exiSource, new StreamResult(exiOS));
String extracted = exiOS.toString();
exiOS.close();
return extracted;
}
public static void main(String[] args) throws IOException, EXIException,
SAXException, TransformerException {
String xml = "<Root><Child id=\"1\">Text</Child><EmptyTag/></Root>";
byte[] compressed = ExiCompressionUtils.compress(xml);
System.out.println(ExiCompressionUtils.extract(compressed));
}https://stackoverflow.com/questions/14388309
复制相似问题