代碼如下
public class GZIPDemo { public static void main(String [] args) throws IOException{ String s ="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; //我這里用字節流輸出的,所以轉正byte[] byte[] b = s.getBytes(); System.out.println("壓縮前:"+b.length); //緩存數據用的字節數組流 ByteArrayOutputStream bout = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); //壓縮用的是這個流 GZIPOutputStream gout = new GZIPOutputStream(bout); gout.write(b);//把b寫入到緩沖區中,也就是ByteArrayOutputStream gout.close();//關閉流,也就是把數據全都刷到字節數組流中 b = bout.toByteArray();//這個字節數組流關閉之后還能用,不用擔心,從他里面把壓縮好的數據拿出來,還是放在byte[]中 System.out.println("壓縮后:"+b.length); ByteArrayInputStream bis = new ByteArrayInputStream(b); GZIPInputStream gis =new GZIPInputStream(bis); int len = -1; byte [] b1 =new byte[1024]; StringBuilder sb = new StringBuilder(); while((len = gis.read(b1)) != -1){ bos.write(b1, 0, len); } bos.close(); System.out.println("解壓之后:"+bos.toByteArray().length); System.out.println(bos.toString()); } private static void gizp2file() throws UnsupportedEncodingException, FileNotFoundException, IOException { // 做准備壓縮一個字符文件,注,這里的字符文件要是GBK編碼方式的12 BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream("d:/電腦提速.htm"), "GBK")); // 使用GZIPOutputStream包裝OutputStream流,使其具體壓縮特性,最后會生成test.txt.gz壓縮包 // 並且里面有一個名為test.txt的文件 BufferedOutputStream out = new BufferedOutputStream( new GZIPOutputStream(new FileOutputStream("d:/電腦提速.htm.gz"))); System.out.println("開始寫壓縮文件..."); int c; while ((c = in.read()) != -1) { /* * 注,這里是壓縮一個字符文件,前面是以字符流來讀的,不能直接存入c,因為c已是Unicode * 碼,這樣會丟掉信息的(當然本身編碼格式就不對),所以這里要以GBK來解后再存入。 */ out.write(String.valueOf((char) c).getBytes("GBK")); } in.close(); out.close(); System.out.println("開始讀壓縮文件..."); // 使用GZIPInputStream包裝InputStream流,使其具有解壓特性 BufferedReader in2 = new BufferedReader(new InputStreamReader( new GZIPInputStream(new FileInputStream("d:/PrintStreamTest.java.gz")), "GBK")); String s; // 讀取壓縮文件里的內容 while ((s = in2.readLine()) != null) { System.out.println(s); } in2.close(); } }
經測試 數據壓縮無誤;