/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.citrus.util.io;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import com.alibaba.citrus.util.StringUtil;
import com.alibaba.citrus.util.io.OutputEngine.OutputStreamFactory;
import org.junit.Before;
import org.junit.Test;
public class OutputEngineTests {
private String charData;
private byte[] data;
@Before
public void init() throws Exception {
charData = StringUtil.repeat("中华民国", 1024 / 16 * 100);
data = charData.getBytes("UTF-8");
}
@Test
public void compressInputStream() throws Exception {
// GZIPInputStream是对压缩流进行解压缩:read() 原始数据 <- decompress <- compressed data stream
// GZIPOutputStream是对输出流进行压缩:write() 原始数据 -> compress -> compressed data stream
// 但是JDK中不存在这样一个流:read() compressed data <- compress <- 原始数据流
// 利用OutputEngine就可以实现这样的流。
// 原始数据输入流
InputStream rawDataStream = new ByteArrayInputStream(data);
// OutputEngine:读取输入流,输出到GZIPOutputStream,实现压缩。
OutputEngine isoe = new InputStreamOutputEngine(rawDataStream, new OutputStreamFactory() {
public OutputStream getOutputStream(OutputStream out) throws IOException {
return new GZIPOutputStream(out);
}
});
// 从OutputEngine中直接取得压缩输入流
OutputEngineInputStream compressedDataStream = new OutputEngineInputStream(isoe);
byte[] compressedData = StreamUtil.readBytes(compressedDataStream, true).toByteArray();
assertTrue(compressedData.length < data.length);
// 从压缩流中恢复
InputStream zis = new GZIPInputStream(new ByteArrayInputStream(compressedData));
byte[] decompressedData = StreamUtil.readBytes(zis, true).toByteArray();
assertArrayEquals(data, decompressedData);
}
@Test
public void compressInputStream_fromReader() throws Exception {
// 创建这样的输入流:read() compressed data <- compress <- 原始char数据流
// 原始数据输入流
Reader rawDataStream = new StringReader(charData);
// OutputEngine:读取输入流,输出到GZIPOutputStream,实现压缩。
OutputEngine isoe = new ReaderOutputEngine(rawDataStream, new OutputStreamFactory() {
public OutputStream getOutputStream(OutputStream out) throws IOException {
return new GZIPOutputStream(out);
}
}, "UTF-8");
// 从OutputEngine中直接取得压缩输入流
OutputEngineInputStream compressedDataStream = new OutputEngineInputStream(isoe);
byte[] compressedData = StreamUtil.readBytes(compressedDataStream, true).toByteArray();
assertTrue(compressedData.length < charData.length());
// 从压缩流中恢复
Reader zis = new InputStreamReader(new GZIPInputStream(new ByteArrayInputStream(compressedData)), "UTF-8");
String decompressedData = StreamUtil.readText(zis, true);
assertEquals(charData, decompressedData);
}
}