早上在论坛中看到有人提问, 感觉有点兴趣, 于是就看了一下. 首先想到的是java 自带的zip 包. 看了一下API文档, 发现原来有完整的例子, 包括压缩和解压缩. 以下的内容来自java.util.zip.Inflater的javadoc, 只是稍作了一些修改.
public static void compressString() {
System.out.println("//START//");
try {
// Encode a String into bytes
String inputString = "LLLLLLLLLLLLLLLLLLLLLLLLLOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG";
byte[] input = inputString.getBytes("UTF-8");
// Compress the bytes
byte[] output = new byte[100];
Deflater compresser = new Deflater();
compresser.setInput(input);
compresser.finish();
int compressedDataLength = compresser.deflate(output);
System.out.println("Input string:" + inputString);
System.out.println("Input length:" + input.length);
System.out.println("Compressed length:" + compressedDataLength);
System.out.println("Compressed string:" + new String(output));
// Decompress the bytes
Inflater decompresser = new Inflater();
decompresser.setInput(output, 0, compressedDataLength);
byte[] result = new byte[100];
int resultLength = decompresser.inflate(result);
decompresser.end();
// Decode the bytes into a String
String outputString = new String(result, 0, resultLength, "UTF-8");
System.out.println("Decompressed string:" + outputString);
} catch (java.io.UnsupportedEncodingException ex) {
// handle
} catch (java.util.zip.DataFormatException ex) {
// handle
}
}
找到了现成的代码, 感觉还有些不过瘾, 于是又藏式用stream方式来实现.
public static void compressStringWithStream() throws Exception {
System.out.println("//START//");
String inputString = "LLLLLLLLLLLLLLLLLLLLLLLLLOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG";
byte[] input = inputString.getBytes();
// compress
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DeflaterOutputStream zos = new DeflaterOutputStream(baos);
zos.write(input);
zos.finish();
zos.flush();
byte[] compressedData = baos.toByteArray();
System.out.println("Input string:" + inputString);
System.out.println("Input length:" + input.length);
System.out.println("Compressed length:" + compressedData.length);
System.out.println("Compressed string:" + new String(compressedData));
// decompress
ByteArrayInputStream bais = new ByteArrayInputStream(compressedData);
// Inflater inflater = new Inflater();
// inflater.setInput(compressedData);
// InflaterInputStream gis = new InflaterInputStream(bais, new Inflater());
InflaterInputStream gis = new InflaterInputStream(bais);
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
int i;
while ((i = gis.read()) != -1) {
baos2.write(i);
}
byte[] decompressedData = baos2.toByteArray();
gis.read(decompressedData);
System.out.println("Decompressed length:" + decompressedData.length);
System.out.println("Decompressed string:" + new String(decompressedData));
}
其实碰到问题需要解决时, 思路很重要, 要试着去找最直接简单的方法. 压缩 > zip > java.util.zip 想到这个, 问题解决一半了. 这个也需要一定的经验, 就是说你至少要知道java已经提供了zip包. 说道这里, 不得不说的是, 很多东西(工具/类库), 其实当你看第一眼的时候, 你只需要去了解他能够做什么, 至于怎么用如果时间有限的话可以暂时不看, 到了真正要使用的时候再去看也不迟. 只要知道有这么个东西, 当你碰到相应的问题的时候能够想到可以用它来帮你解决问题就好了. 这个也是需要积累的, 但是只看一个功能概要比起仔细研究来说, 所花的时间少多了. 只有到了真正使用的时候才去了解. 另外, 在互联网发达的现在, 应该更好的去利用搜索引擎. 就算java本身没有提供zip包, 你也应该且十分必要去尝试搜索是否已经有人实现了这个功能, open source这么多, 很多时候总有一款能够满足你的需求, 应该尽量避免重新造轮子.