在文件的传输过程中,为了使大文件能够更加方便快速的传输,一般采用压缩的办法来对文件压缩后再传输,JAVA中的java.util.zip包中的Deflater和Inflater类为使用者提供了DEFLATE算法的压缩功能,以下是自已编写的压缩和解压缩实现,并以压缩文件内容为例说明,其中涉及的具体方法可查看JDK的API了解说明。
1 /** 2 * 3 * @param inputByte 4 * 待解压缩的字节数组 5 * @return 解压缩后的字节数组 6 * @throws IOException 7 */ 8 public static byte[] uncompress(byte[] inputByte) throws IOException { 9 int len = 0; 10 Inflater infl = new Inflater(); 11 infl.setInput(inputByte); 12 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 13 byte[] outByte = new byte[1024]; 14 try { 15 while (!infl.finished()) { 16 // 解压缩并将解压缩后的内容输出到字节输出流bos中 17 len = infl.inflate(outByte); 18 if (len == 0) { 19 break; 20 } 21 bos.write(outByte, 0, len); 22 } 23 infl.end(); 24 } catch (Exception e) { 25 // 26 } finally { 27 bos.close(); 28 } 29 return bos.toByteArray(); 30 } 31 32 /** 33 * 压缩. 34 * 35 * @param inputByte 36 * 待压缩的字节数组 37 * @return 压缩后的数据 38 * @throws IOException 39 */ 40 public static byte[] compress(byte[] inputByte) throws IOException { 41 int len = 0; 42 Deflater defl = new Deflater(); 43 defl.setInput(inputByte); 44 defl.finish(); 45 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 46 byte[] outputByte = new byte[1024]; 47 try { 48 while (!defl.finished()) { 49 // 压缩并将压缩后的内容输出到字节输出流bos中 50 len = defl.deflate(outputByte); 51 bos.write(outputByte, 0, len); 52 } 53 defl.end(); 54 } finally { 55 bos.close(); 56 } 57 return bos.toByteArray(); 58 } 59 60 public static void main(String[] args) { 61 try { 62 FileInputStream fis = new FileInputStream("D:\\testdeflate.txt"); 63 int len = fis.available(); 64 byte[] b = new byte[len]; 65 fis.read(b); 66 byte[] bd = compress(b); 67 // 为了压缩后的内容能够在网络上传输,一般采用Base64编码 68 String encodestr = Base64.encodeBase64String(bd); 69 byte[] bi = uncompress(Base64.decodeBase64(encodestr)); 70 FileOutputStream fos = new FileOutputStream("D:\\testinflate.txt"); 71 fos.write(bi); 72 fos.flush(); 73 fos.close(); 74 fis.close(); 75 } catch (Exception e) { 76 // 77 } 78 }