Java壓縮技術(一) ZLib
ZLib可以簡單的理解為壓縮/解壓縮演算法,它與ZIP、RAR等歸檔演算法有所不同,與bzip2比較接近。
壓縮工具程式碼如下:
Java程式碼
- /**
- * 2009-9-9
- */
- package org.zlex.commons.io;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
-
import java.util.zip.Deflater;
- import java.util.zip.DeflaterOutputStream;
- import java.util.zip.Inflater;
- import java.util.zip.InflaterInputStream;
- /**
- * ZLib壓縮工具
- *
- * @author <a href="mailto:[email protected]">樑棟</a>
- * @version 1.0
- * @since 1.0
- */
- public abstract class ZLibUtils {
- /**
-
* 壓縮
- *
- * @param data
- * 待壓縮資料
- * @return byte[] 壓縮後的資料
- */
- public static byte[] compress(byte[] data) {
- byte[] output = new byte[0];
- Deflater compresser = new Deflater();
- compresser.reset();
- compresser.setInput(data);
-
compresser.finish();
- ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);
- try {
- byte[] buf = new byte[1024];
- while (!compresser.finished()) {
- int i = compresser.deflate(buf);
- bos.write(buf, 0, i);
- }
- output = bos.toByteArray();
- } catch (Exception e) {
- output = data;
- e.printStackTrace();
- } finally {
- try {
- bos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- compresser.end();
- return output;
- }
- /**
- * 壓縮
- *
- * @param data
- * 待壓縮資料
- *
- * @param os
- * 輸出流
- */
- public static void compress(byte[] data, OutputStream os) {
- DeflaterOutputStream dos = new DeflaterOutputStream(os);
- try {
- dos.write(data, 0, data.length);
- dos.finish();
- dos.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 解壓縮
- *
- * @param data
- * 待壓縮的資料
- * @return byte[] 解壓縮後的資料
- */
- public static byte[] decompress(byte[] data) {
- byte[] output = new byte[0];
- Inflater decompresser = new Inflater();
- decompresser.reset();
- decompresser.setInput(data);
- ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
- try {
- byte[] buf = new byte[1024];
- while (!decompresser.finished()) {
- int i = decompresser.inflate(buf);
- o.write(buf, 0, i);
- }
- output = o.toByteArray();
- } catch (Exception e) {
- output = data;
- e.printStackTrace();
- } finally {
- try {
- o.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- decompresser.end();
- return output;
- }
- /**
- * 解壓縮
- *
- * @param is
- * 輸入流
- * @return byte[] 解壓縮後的資料
- */
- public static byte[] decompress(InputStream is) {
- InflaterInputStream iis = new InflaterInputStream(is);
- ByteArrayOutputStream o = new ByteArrayOutputStream(1024);
- try {
- int i = 1024;
- byte[] buf = new byte[i];
- while ((i = iis.read(buf, 0, i)) > 0) {
- o.write(buf, 0, i);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return o.toByteArray();
- }
- }
測試用例程式碼如下:
Java程式碼
- /**
- * 2009-9-9
- */
- package org.zlex.commons.io;
- import static org.junit.Assert.*;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import org.junit.Test;
- /**
- * ZLib壓縮測試用例
- *
- * @author <a href="mailto:[email protected]">樑棟</a>
- * @version 1.0
- * @since 1.0
- */
- public class ZLibUtilsTest {
- @Test
- public final void testBytes() {
- System.err.println("位元組壓縮/解壓縮測試");
- String inputStr = "[email protected];[email protected];[email protected]";
- System.err.println("輸入字串:\t" + inputStr);
- byte[] input = inputStr.getBytes();
- System.err.println("輸入位元組長度:\t" + input.length);
- byte[] data = ZLibUtils.compress(input);
- System.err.println("壓縮後位元組長度:\t" + data.length);
- byte[] output = ZLibUtils.decompress(data);
- System.err.println("解壓縮後位元組長度:\t" + output.length);
- String outputStr = new String(output);
- System.err.println("輸出字串:\t" + outputStr);
- assertEquals(inputStr, outputStr);
- }
- @Test
- public final void testFile() {
- String filename = "zlib";
- File file = new File(filename);
- System.err.println("檔案壓縮/解壓縮測試");
- String inputStr = "[email protected];[email protected];[email protected]";
- System.err.println("輸入字串:\t" + inputStr);
- byte[] input = inputStr.getBytes();
- System.err.println("輸入位元組長度:\t" + input.length);
- try {
- FileOutputStream fos = new FileOutputStream(file);
- ZLibUtils.compress(input, fos);
- fos.close();
- System.err.println("壓縮後位元組長度:\t" + file.length());
- } catch (Exception e) {
- fail(e.getMessage());
- }
- byte[] output = null;
- try {
- FileInputStream fis = new FileInputStream(file);
- output = ZLibUtils.decompress(fis);
- fis.close();
- } catch (Exception e) {
- fail(e.getMessage());
- }
- System.err.println("解壓縮後位元組長度:\t" + output.length);
- String outputStr = new String(output);
- System.err.println("輸出字串:\t" + outputStr);
- assertEquals(inputStr, outputStr);
- }
- }
輸入結果
Consloe程式碼
- 位元組壓縮/解壓縮測試
- 輸入字串: [email protected];[email protected];[email protected]
- 輸入位元組長度: 59
- 壓縮後位元組長度: 39
-
相關推薦
Java壓縮技術(一) ZLib
有關ZLib可參見官方主頁 http://www.zlib.net/ZLib可以簡單的理解為壓縮/解壓縮演算法,它與ZIP、RAR等歸檔演算法有所不同,與bzip2比較接近。 壓縮工具程式碼如下: Java程式碼 /** * 2009-9-9 */
Java加密技術(一)——BASE64與單向加密算法MD5&SHA&MAC
sha256 integer 被人 sent 發現 Coding design 如果 targe http://snowolf.iteye.com/blog/379860 加密解密,曾經是我一個畢業設計的重要組件。在工作了多年以後回想當時那個加密、解密算法,實在是太單
淺談存儲重刪壓縮技術(一)
emc 將他 壓力測試 處理方式 比對 公眾號 center str 今天 淺談重刪壓縮技術(一) <喜歡更多內容可以關註微信公眾號“圍爐煮酒論IT”>作為一個做企業存儲市場的存儲人,最近兩年我不斷被重刪壓縮撩撥著。對於重刪壓縮這個技術的好壞,真實需求還是偽需求
Java壓縮技術(二) ZIP壓縮——Java原生實現
查過相關資料後才知道,ZIP應該算作歸檔類的壓縮演算法,每一門學科都可深可淺!閒言少敘,先說ZIP壓縮。 zip壓縮需要通過ZipOutputStream 執行write方法將壓縮資料寫到指定輸出流中。 注意,這裡應先使用CheckedOutputStream 指定檔案校驗
10.1-全棧Java筆記:最全面的IO技術(一)
javaIO技術對於任何程序設計語言而言,輸入輸出(Input/Output)系統都是非常核心的功能。程序運行需要數據,數據的獲取往往需要跟外部系統進行通信,外部系統可能是文件、數據庫、其他程序、網絡、IO設備等等。外部系統比較復雜多變,那麽我們有必要通過某種手段進行抽象、屏蔽外部的差異,從而實現更加便捷的編
PDF技術(一)-Java實現Office系列檔案轉PDF檔案
最近,公司要求做個檔案轉pdf的調研報告,於是在網上找了一些實現方法,現在將這些方法做個對比,並記錄下來,以後或許有用呢,哈哈。 首先說一下需求,產品要求不能使用第三方軟體實現,因為這種實現方式效率不高,所以需要使用“純Java程式碼”實現。同時也對跨平臺有要求,系統需要執行在linux系統
JAVA爬蟲---驗證碼識別技術(一)
Python中有專門的影象處理技術比如說PIL,可以對驗證碼一類的圖片進行二值化處理,然後對圖片進行分割,進行畫素點比較得到圖片中的數字。這種方案對驗證碼的處理相對較少,運用相對普遍,很多驗證碼圖片可以通過這個方式得到識別,當然還需要一部分的降
【JAVA秒會技術之玩轉SQL】MySQL優化技術(一)
MySQL優化技術(一) 開發的路上,總會碰到一些老系統,越用越慢。“慢”的原因也許有很多,但是,博主個人覺得,資料庫的設計和sql語句寫的好壞,對系統效率的影響是最直接,最顯而易見的!所以,學習一下MySQL的優化,還是很有必要的。當然,博主能力有限,沒那
[Java 多執行緒技術](一)執行緒和程序以及並行和併發的概念
程序與執行緒 1、 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向執行緒設計的計算機結構中,程序是執行緒的容
JAVA技術(一)——位元組碼&反射
Reflection-反射是J2SE1.1就已經提出了,但當時僅支援Introspection自省。在1.2之後開始逐漸成熟,spirng、hibernate等成熟框架都大量使用java反射技術實現。在面向物件設計思想中,使用類這一概念表述一類具有相同屬性的物件;而這些屬性值
【java】簡介(一)
編碼 http ... 設計 適合 不能 高度 代碼格式 操作系統 應用:web後端開發、android-app開發、大數據應用開發 學習:java會過時,但程序設計的思想不會過時 特點:1、面向對象,跨平臺,語法比c++簡單 2、以字節碼的形式運行在虛擬機上
Java小故事(一)
時間 abs 十年 caption out 創建 long ger i++ 1 import java.util.Date; //導入包 2 public class Test11 { 3
【問底】夏俊:深入站點服務端技術(一)——站點並發的問題
而是 思路 臨時 系統負載 表現 json article 不能 情況 摘要:本文來自擁有十年IT從業經驗、擅長站點架構設計、Web前端技術以及Java企業級開發的夏俊,此文也是《關於大型站點技術演進的思考》系列文章的最新出爐內容。首發於CSDN,各位技術人員不
Java加密技術(八)——數字證書
keystore 表示 encode png 代碼 簽名 更新 rsa加密 turn 原文:http://snowolf.iteye.com/blog/391931 請大家在閱讀本篇內容時先閱讀 Java加密技術(四),預先了解RSA加密算法。 在構建Java代碼實現前
Java語法糖(一)
級別 類型擦除 簽名 轉換 uga pre 它的 out fde 概述 語法糖(Syntactic Sugar):主要作用是提高編碼效率,減少編碼出錯的機會。 解語法糖發生在Java源碼被編譯成Class字節碼的過程中,還原回簡單的基礎語法結構。 語法糖之一:泛型(
java基礎——Servlet(一)
.get protected pre exc 規範 直接下載 程序 新建 路徑 一.Servlet簡介 Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,用Java編寫的服務器端程序,主要功能在於交互式地瀏覽和修改數據
JAVA學習總結(一)
產生 java虛擬機 右鍵 分布式系 jdk 問題 功能 地址 輸出 一、Java是什麽? Java 是由 Sun Microsystems 在 1995 年首先發布的編程語言和計算平臺。Java 是一項用於開發應用程序的技術,可以讓 Web 變得更有意思和更實用。有許多應
Java學習筆記(一)
fun 編程語言 java 初始化 創建 abs 就是 p s 屬性 1.1. 一個數取反的算法 a取反,~a=-(a+1)。如 ~5=-6,~(-8)=7 1.2. Java中類的訪問控制符 (類的修飾符有public、default、abstract、final,方法的
JAVA枚舉(一)引入枚舉知識點的前戲
java枚舉/* 例子:定義一個員工類Employees,使用一個變量restday來表示他哪一天休息 */ //-------------------------------version:0.1---------------------- /* class Employees { privat
java枚舉(二):即對java枚舉(一)中的例子進行拓展
枚舉/* 知識點:枚舉 枚舉是從java5開始提供的一種新的數據類型,是一個特殊的類,就是多個常量對象的集合 定義格式: [修飾符] enum 枚舉類名 { 常量A, 常量B, 常量C; } */ //定義枚舉 enum Weekday { Mond