本文目錄一覽:
Java數據壓縮格式程序設計方法
GZIP壓縮格式簡介在JDK API中 同樣定義了多種類型用於創建和解除GZIP壓縮格式數據文件的通用對象和方法 用於基於JDK編寫GZIP壓縮數據管理程序 GZIP壓縮格式是在Sun Solaris操作系統中廣泛採用的壓縮數據格式 由於在數據壓縮過程中可以採用多種類型的壓縮算法 因此 壓縮文件的壓縮比很高 另外 在創建的壓縮文件中 定義了用於表述時間和文件屬主的時戳(Time Stamp) 可以使文件方便地在網絡中傳輸和交換 GZIP壓縮數據文件由一系列的數字構成 而各數字對應如下描述壓縮文件信息的字段 ID 缺省值 用於標識GZIP壓縮格式 ID 缺省值 用於標識GZIP壓縮格式 CM 採用的壓縮方法 其值為 ~ 是保留值 標識採用 deflate 壓縮方法 FLG 用於標識各佔用位的標誌 MTIME 記錄了最近修改時間 XFL 用於標識採用壓縮算法的選項 OS 定義了操作系統類型 XLEN 定義了附加信息段的長度 M 壓縮文件說明信息 CRC 記錄了CRC 算法採用的循環冗餘校驗值 上述信息完整描述了GZIP壓縮格式數據 當然 基於JDK開發的壓縮數據管理程序 不需要明確知道上述壓縮數據定義格式 只需要創建相應的管理對象並調用這些對象中定義的方法即可 JDK API中ZIP壓縮格式支持對象GZIP壓縮格式是在JDK API中定義支持的另外一種數據壓縮格式 由上面介紹的GZIP格式數據壓縮方法可知 GZIP壓縮格式具有更大的壓縮比 因此 在Unix操作系統中 這種類型的數據壓縮形式的應用十分普及 與JDK API對ZIP壓縮格式的支持不同 在JDK API中 只定義了GZIPInputStream和GZIPOutputStream兩種類型的流(Stream)對象 用於在基於流的數據傳輸過程中實現數據壓縮 這兩個對象的繼承定義結構如下所示 java lang Object|+ java io InputStream|+ java io FilterInputStream|+ java util zip InflaterInputStream|+ java util zip GZIPInputStream(java util zip GZIPOutputStream)以採用GZIP格式進行數據輸入處理GZIPInputStream對象為例 由上述對象的繼承定義結構可以看出 該對象繼承了InflaterInputStream流對象 需要說明的是 在ZIP壓縮包中 定義了Inflater和Deflater兩個對象 用於基於ZLIB壓縮庫實現多種格式的數據壓縮和解壓縮 因此 InflaterInputStream流對象的作用是採用ZLIB庫作為數據壓縮管理的引擎 而GZIPInputStream對象則進一步將流的數據加工進行細化 用於讀取GZIP格式的壓縮數據 同理 GZIPOutputStream對象用於創建GZIP格式的壓縮數據文件 下面 將對兩個對象的定義內容進行說明 ●GZIPInputStream對象定義結構 java util zip GZIPInputStream靜態成員變量 protected CRC crc 用於說明採用的數據壓縮算法為CRC protected boolean eos 說明輸入流對象結束讀取輸入數據 構造方法 GZIPInputStream(InputStream in) 採用默認的緩衝區字節數創建輸入流對象 GZIPInputStream(InputStream in int size) 創建由整數類型變量size指定緩衝區字節數的輸入流對象 成員方法 該對象只定義了如下兩個成員方法 void close() 關閉輸入流對象 int read(byte[] buf int off int len) 讀取輸入流的數據到buf字節數組中 ●GZIPOutputStream對象定義結構 java util zip GZIPOutputStream靜態成員變量 protected CRC crc 用於說明採用的數據壓縮算法為CRC 構造方法 GZIPOutputStream(OutputStream out) 採用默認的緩衝區字節數創建輸出流對象 GZIPOutputStream(OutputStream out int size) 創建由整數類型變量size指定緩衝區字節數的輸出流對象 成員方法 void close() 關閉輸出流對象 void finish() 結束數據輸出 但不關閉輸出流對象 void write(byte[] buf int off int len) 將字節數組buf中的內容壓縮輸出到輸出流對象中 創建GZIP壓縮格式文件實例經過前面對JDK API中創建GZIP壓縮格式文件的相關對象的結構 成員方法定義形式的說明 讀者一定會問如何應用這些對象和對象中定義的成員方法呢?請讀者看下面的實例代碼 //ZipDemo javaimport java io *; import java util zip *; public class GZIPDemo { public static void main(String[] args) { if (args length != ) { System out println(“Usage:java GZIPDemo SourceFile DestnFile” + args length); System exit( ); } try { int number; //打開需壓縮文件作為文件輸入流 FileInputStream fin = new FileInputStream(args[ ]); //建立壓縮文件輸出流FileOutputStream fout=new FileOutputStream(args[ ]); //建立GZIP壓縮輸出流 GZIPOutputStream gzout=new GZIPOutputStream(fout); //設定讀入緩衝區尺寸byte[] buf=new byte[ ]; while ((number = fin read(buf)) != ) gzout write(buf number); gzout close(); fout close(); fin close(); }catch(IOException e) { System out println(e); } } }上面的程序用於將命令行中指定的文件SourceFile進行壓縮 創建GZIP格式的壓縮文件DestnFile 在該程序的實現代碼中 首先創建用於進行文件輸入和輸出的FileInputStream和FileOutputStream對象 並以FileOutputStream對象實例為參數創建GZIPOutputStream對象實例 從而為創建GZIP格式壓縮文件建立數據流基礎 在隨後的代碼中 利用FileInputStream對象中定義的read方法 從源文件中讀取待壓縮文件的內容 同時利用GZIPOutputStream對象中定義的write方法將壓縮後的數據寫出到輸出文件中 從而實現數據文件的GZIP格式壓縮處理 在Java中創建GZIP格式壓縮文件的方法很簡單 並且利用WinZip WinRAR等類型的壓縮管理軟件均能夠打開創建的GZIP格式的壓縮文件 那麼 如何利用JDK API中定義的對象將被壓縮的文件解壓縮呢?請讀者看下一節的內容 GZIP格式文件解壓縮實例下面的程序用於將利用JDK API中定義對象的成員方法 將GZIP格式壓縮文件進行解壓縮 從而恢復壓縮原始文件 //UnGZIPDemo javaimport java io *; import java util zip *; public class UnGZIPDemo { public static void main(String[] args) { if (args length != ) { System out println(“Usage:java UnGZIPDemo GZIPFile DestnFile”); System exit( ); } try { int number;//建立GZIP壓縮文件輸入流 FileInputStream fin=new FileInputStream(args[ ]); //建立GZIP解壓工作流 GZIPInputStream gzin=new GZIPInputStream(fin); //建立解壓文件輸出流 FileOutputStream fout=new FileOutputStream(args[ ]); //設定讀入緩衝區尺寸byte[] buf=new byte[ ]; while ((nnumber=gzin read(buf buf length)) != ) fout write(buf nnumber); gzin close(); fout close(); fin close(); }catch(IOException e) { System out println(e); } } }在GZIP格式壓縮文件解壓縮程序代碼中 仍然首先創建FileInputStream和FileOutputStream對象 並基於創建的FileInputStream對象創建GZIPInputStream對象 在隨後的代碼中 調用GZIPInputStream對象中定義的read方法 在從壓縮文件中讀取數據內容並進行解壓縮處理後 將解除壓縮後的數據內容利用文件輸出流對象進行輸出 從而實現數據文件的解壓縮處理 小 lishixinzhi/Article/program/Java/hx/201311/27034
用java如何實現壓縮字符串?
package javase1.day02;\x0d\x0a /**\x0d\x0a * 1)一種字符串壓縮算法\x0d\x0a * str =”aaaabbccccddeaaa”\x0d\x0a * 壓縮為:”4a2b4c2d1e3a”\x0d\x0a * 原理實現:\x0d\x0a * str = “aaaabbccccddeaaa”\x0d\x0a * \x0d\x0a * c = str.charAt(i)//c是每個字符\x0d\x0a * 1) 初始化\x0d\x0a * StringBuilder buf = new StringBuilder();\x0d\x0a * int count = 0;代表相同的字符個數\x0d\x0a * char ch = str.charAt(0);代表正在統計的相同字符’a’ \x0d\x0a * 2) 從i=1開始迭代每個字符\x0d\x0a * c = str.charAt(i);//c是每個當前字符\x0d\x0a * 3) 檢查當前字符c與被統計ch是否一致\x0d\x0a * 如果一致 count++\x0d\x0a * 否則(不一致)\x0d\x0a * 向緩衝區buf增加count+ch\x0d\x0a * count=0,ch=c;\x0d\x0a * 3)沒有下個字符就結束\x0d\x0a * 4)還有字符串嗎?回到2)\x0d\x0a * \x0d\x0a * 2)實現還原算法\x0d\x0a * str = “4a2b4c2d1e3a”;\x0d\x0a * i\x0d\x0a */\x0d\x0apublic class Demo5 {\x0d\x0a public static void main(String[] args) {\x0d\x0a String s = comp(“aaaawwwwe”);\x0d\x0a System.out.println(s);\x0d\x0a// System.out.println(decomp(s));\x0d\x0a \x0d\x0a }\x0d\x0a public static String comp(String str){\x0d\x0a int i = 1;\x0d\x0a StringBuilder buf = new StringBuilder();\x0d\x0a int count = 1;\x0d\x0a char ch = str.charAt(0);\x0d\x0a for(;;){\x0d\x0a char c = i==str.length() ? ‘\10’:str.charAt(i);\x0d\x0a if(c==ch){\x0d\x0a count++;\x0d\x0a }else{\x0d\x0a if(count == 1)\x0d\x0a buf.append(ch);\x0d\x0a else \x0d\x0a buf.append(count).append(ch);\x0d\x0a count=1;\x0d\x0a ch = c;\x0d\x0a } \x0d\x0a i++;\x0d\x0a if(i==str.length()+1){\x0d\x0a break;\x0d\x0a } \x0d\x0a }\x0d\x0a return buf.toString();\x0d\x0a \x0d\x0a }\x0d\x0a}
JAVA 壓縮和序列化
壓縮和序列化主要用在數據的存儲和傳輸上,二者都是由IO流相關知識實現,這裡統一介紹下。
全部章節傳送門:
Java I/O類支持讀寫壓縮格式的數據流,你可以用他們對其他的I/O流進行封裝,以提供壓縮功能。
GZIP接口比較簡單,適合對單個數據流進行壓縮,在Linux系統中使用較多。
ZIP格式可以壓縮多個文件,而且可以和壓縮工具進行協作,是經常使用的壓縮方法。
JAR(Java Archive,Java 歸檔文件)是與平台無關的文件格式,它允許將許多文件組合成一個壓縮文件。為 J2EE 應用程序創建的 JAR 文件是 EAR 文件(企業 JAR 文件)。
JAR 文件格式以流行的 ZIP 文件格式為基礎。與 ZIP 文件不同的是,JAR 文件不僅用於壓縮和發布,而且還用於部署和封裝庫、組件和插件程序,並可被像編譯器和 JVM 這樣的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用來指示工具如何處理特定的 JAR。
如果一個Web應用程序的目錄和文件非常多,那麼將這個Web應用程序部署到另一台機器上,就不是很方便了,我們可以將Web應用程序打包成Web 歸檔(WAR)文件,這個過程和把Java類文件打包成JAR文件的過程類似。利用WAR文件,可以把Servlet類文件和相關的資源集中在一起進行發布。在這個過程中,Web應用程序就不是按照目錄層次結構來進行部署了,而是把WAR文件作為部署單元來使用。
一個WAR文件就是一個Web應用程序,建立WAR文件,就是把整個Web應用程序(不包括Web應用程序層次結構的根目錄)壓縮起來,指定一個.war擴展名。下面我們將第2章的Web應用程序打包成WAR文件,然後發布
要注意的是,雖然WAR文件和JAR文件的文件格式是一樣的,並且都是使用jar命令來創建,但就其應用來說,WAR文件和JAR文件是有根本區別的。JAR文件的目的是把類和相關的資源封裝到壓縮的歸檔文件中,而對於WAR文件來說,一個WAR文件代表了一個Web應用程序,它可以包含 Servlet、HTML頁面、Java類、圖像文件,以及組成Web應用程序的其他資源,而不僅僅是類的歸檔文件。
在命令行輸入jar即可查看jar命令的使用方法。
把對象轉換為字節序列的過程稱為對象的序列化。把字節序列恢復為對象的過程稱為對象的反序列化。
對象的序列化主要有兩種用途:
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,並將其返回。
只有實現了Serializable的對象才能被序列化。對象序列化包括如下步驟:
對象反序列化的步驟如下:
創建一個可以可以序列化的對象。
然後進行序列化和反序列化測試。
serialVersionUID: 字面意思上是序列化的版本號,凡是實現Serializable接口的類都有一個表示序列化版本標識符的靜態變量。
JAVA序列化的機制是通過判斷類的serialVersionUID來驗證的版本一致的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID於本地相應實體類的serialVersionUID進行比較。如果相同說明是一致的,可以進行反序列化,否則會出現反序列化版本一致的異常,即是InvalidCastException。
為了提高serialVersionUID的獨立性和確定性,強烈建議在一個可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。
控制序列化字段還可以使用Externalizable接口替代Serializable借口。此時需要定義一個默認構造器,否則將為得到一個異常(java.io.InvalidClassException: Person; Person; no valid constructor);還需要定義兩個方法(writeExternal()和readExternal())來控制要序列化的字段。
如下為將Person類修改為使用Externalizable接口。
transient修飾符僅適用於變量,不適用於方法和類。在序列化時,如果我們不想序列化特定變量以滿足安全約束,那麼我們應該將該變量聲明為transient。執行序列化時,JVM會忽略transient變量的原始值並將默認值(引用類型就是null,數字就是0)保存到文件中。因此,transient意味着不要序列化。
靜態變量不是對象狀態的一部分,因此它不參與序列化。所以將靜態變量聲明為transient變量是沒有用處的。
javazip壓縮包過大解壓失敗
javazip壓縮包過大解壓失敗的原因:網絡傳輸不好導致文件下載損壞、網站提供的RAR壓縮包最初被損壞、使用的下載工具不夠完善。我們可以通過壓縮軟件里的“修復壓縮文件”解決javazip壓縮包過大解壓失敗的問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/193654.html