前言
这篇文章主要讲解Java解压的操作,后续会写一篇关于压缩的文章。
提醒:文章中有些片段看似代码很多,其实去除trycatch、释放资源真正有用的代码没几句,解压其实都很简单,主要用心去观察,都是依葫芦画瓢。
首先,先写一个类似辅助的视图类
1 public enumFileType {2 //未知
3 UNKNOWN,4 //压缩文件
5 ZIP, RAR, _7Z, TAR, GZ, TAR_GZ, BZ2, TAR_BZ2,6 //位图文件
7 BMP, PNG, JPG, JPEG,8 //矢量图文件
9 SVG,10 //影音文件
11 AVI, MP4, MP3, AAR, OGG, WAV, WAVE12 }
这个类主要是用来将各种文件的类型集中管理,当然,不写这个类也是可以的,可以直接用字符串去表示。
然后,我还写了一个获取文件真实类型的方法
为什么要写这个方法呢?因为,我们是可以直接去修改文件的后缀的,这样很危险!
1 /**
2 * 获取文件真实类型3 *4 *@paramfile 要获取类型的文件。5 *@return文件类型枚举。6 */
7 private staticFileType getFileType(File file){8 FileInputStream inputStream =null;9 try{10 inputStream = newFileInputStream(file);11 byte[] head = new byte[4];12 if (-1 ==inputStream.read(head)) {13 returnFileType.UNKNOWN;14 }15 int headHex = 0;16 for (byteb : head) {17 headHex <<= 8;18 headHex |=b;19 }20 switch(headHex) {21 case 0x504B0304:22 returnFileType.ZIP;23 case 0x776f7264:24 returnFileType.TAR;25 case -0x51:26 returnFileType._7Z;27 case 0x425a6839:28 returnFileType.BZ2;29 case -0x74f7f8:30 returnFileType.GZ;31 case 0x52617221:32 returnFileType.RAR;33 default:34 returnFileType.UNKNOWN;35 }36 }catch(Exception e){37 e.printStackTrace();38 }finally{39 try{40 if(inputStream!=null){41 inputStream.close();42 }43 } catch(IOException e) {44 e.printStackTrace();45 }46 }47 returnFileType.UNKNOWN;48 }
这里是通过文件头信息来判断什么类型的。其他文件的头文件信息,这里就不展示了。如果有需要,可以拿文件来跑跑,看看headHex是啥值就行了。
最后还有一个创建目录的辅助方法
1 /**
2 * 构建目录3 *@paramoutputDir 输出目录4 *@paramsubDir 子目录5 */
6 private static voidcreateDirectory(String outputDir, String subDir){7 File file = newFile(outputDir);8 if(!(subDir == null || subDir.trim().equals(""))) {//子目录不为空
9 file = new File(outputDir + File.separator +subDir);10 }11 if(!file.exists()){12 if(!file.getParentFile().exists()){13 file.getParentFile().mkdirs();14 }15 file.mkdirs();16 }17 }
tar文件解压
接下来是正儿八经的正菜了。第一个来看怎么解压tar文件。