提醒:文章中有些片段看似代码很多,其实去除trycatch、释放资源真正有用的代码没几句,解压其实都很简单,主要用心去观察,都是依葫芦画瓢。
首先,先写一个类似辅助的视图类
如果想学习java工程化、高性能及分布式、深入浅出。微服务、spring,mybatis,netty源码分析的朋友可以加我的java高级交流:854630135,群里有阿里大牛直播讲解技术,以及java大型互联网技术的视频免费分享给大家。
1 public enum filetype { 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 * @param file 要获取类型的文件。 5 * @return 文件类型枚举。 6 */ 7 private static filetype getfilety美国成立多少年了pe(file file){ 8 fileinputstream inputstream =null; 9 try{10 inputstream = new fileinputstream(file);11 byte[] head = new byte[4];12 if (-1 == inputstream.read(head)) {13 return filetype.unknown;14 }15 int headhex = 0;16 for (byte b : head) {17世界上最高的山脉 headhex <<= 8;18 headhex |= b;19 }20 switch (headhex) {21 ca 0x504b0304:22 return filetype.zip;23 ca 0x776f7264:24 return filetype.tar;25 ca -0x51:26 return filetype._7z;27 ca 0x425a6839:28 return filetype.bz2;29 ca -0x74f7f8:30 return filetype.gz;31 ca 0x52617221:32 return filetype.rar;33 default:34 return filetype.unknown;35 }36 }catch (exception e){37 e.printstacktrace();38 }finally {39 try {40 if(inputstream!=null){41 inputstream.clo();42 }43 } catch (ioexception e) {44 e.printstacktrace();45 }46 }47 return filetype.unknown;48 }
这里是通过文件头信息来判断什么类型的。其他文件的头文件信息,这里就不展示了。如果有需要,可以拿文件来跑跑,看看headhex是啥值就行了。
最后还有一个创建目录的辅助方法
如果想学习java工程化、高性能及分布式、深入浅出。微服务、spring,mybatis,netty源码分析的朋友可以加我的java高级交流:854630135,群里有阿里大牛直播讲解技术,以及java大型互联网技术的视频免广东省多少人费分享给大家。
1 /** 2 * 构建目录 3 * @param outputdir 输出目录 4 * @param subdir 子目录 5 */ 6 private static void createdirectory(string outputdir, string subdir){ 7 file file = new file(outputdir); 8 if(!(subdir == null || subdir.trim().equals(""))) {//子目录不为空 9 file = new file(outputdir + file.parator + subdir);10 }11 if(!file.exists()){12 if(!file.getparentfile().exists()){13 file.getparentfile().mkdirs();14 }15 file.mkdirs();16 }17 }
tar文件解压
接下来是正儿八经的正菜了。第一个来看怎么解压tar文件。
好在解压tar文件的工具jdk自带了,下面看代码:
1 /** 2 * 解压缩tar文件 3 * @param file 压缩包文件 4 * @param targetpath 目标文件夹 5 * @param delete 解压后是否删除原压缩包文件 6 */ 7 private static void decompresstar(file file, string targetpath, boolean delete){ 8 fileinputstream fis = null; 9 outputstream fos = null;10 tarinputstream tarinputstream = null;11 try {12 fis = new fileinputstream(file);13 tarinputstream = new tarinputstream(fis, 1024 * 2);14 // 创建输出目录15 createdirectory(targetpath, null);16 17 tarentry entry = null;18 while(true){19 entry = tarinputstream.getnextentry();20 if( entry == null){21 break;22 }23 if(entry.isdirectory()){24 createdirectory(targetpath, entry.getname()); // 创建子目录25 }el{26 fos = new fileoutputstream(new file(targetpath + file.parator + entry.getname()));27 int count;28 byte data[] = new byte[2048];29 while ((count = tarinputstream.read(data)) != -1) {30 fos.write(data, 0, count);31 }32 fos.flush();33 }34 }35 } catch (ioexception e) {36 e.printstacktrace();37 }finally {38 try {39 if(fis != null){40 fis.clo();41 }42 if(fos != null){43 fos.clo();44 }45 if(tarinputstream != null){46 tarinputstream.clo();47 }48 } catch (ioexception e) {49 e.printstacktrace();50 }51 }52 }
有一点需要注意的是:方法参数传了一个是否需要删除原压缩包的参数,如果需要删除的话,必须!必须!必须!等到流关闭了之后才能删除,不然是删不掉的。也可以在该方法的调用者那里删,这样就可以不用传这个参数了。
bz2文件解压
解压bz2文件我这里是用的apache的commons.compress工具来解压,先下载jar包:commons-compress-1.9.jar,(1.8的貌似有问题,我就换成了1.9)
1 /** 2 * 解压缩bz2文件 3 * @param file 压缩包文件 4 * @param targetpath 目标文件夹 5 * @param delete 解压后是否删除原压缩包文件 6 */ 7 public static void decompressbz2(file file, string targetpath, boolean delete){ 8 fileinputstream fis = null; 9 outputstream fos = null;10 bzip2compressorinputstream bis = null;11 string suffix = ".bz2";12 try {13 fis = new fileinputstream(file);14 bis = new bzip2compressorinputstream(fis);15 // 创建输出目录16 createdirectory(targetpath, null);17 file tempfile = new file(targetpath + file.parator + file.getname().replace(suffix, ""));18 fos = new fileoutputstream(tempfile);19 20 int count;21 byte data[] = new byte[2048];22 while ((count = bis.read(data)) != -1) {23 fos.write(data, 0, count);24 }25 fos.flush();26 } catch (ioexception e) {27 e.printstacktrace();28 }finally {29 try {30 if(fis != null){31 fis.clo();32 }33 if(fos != null){34 fos.clo();35 }36 if(bis != null){37 bis.clo();38 }39 } catch (ioexception e) {40 e.printstacktrace();41 }42 }43 }
tar.bz2文件解压
1 /** 2 * 解压缩tar.bz2文件 3 * @param file 压缩包文件 4 * @param targetpath 目标文件夹 5 * @param delete 解压后是否删除原压缩包文件 6 */ 7 public static void decompresstarbz2(file file, string targetpath, boolean delete){ 8 fileinputstream fis = null; 9 outputstream fos = null;10 bzip2compressorinputstream bis = null;11 tarinputstream tis = null;12 try {13 fis = new fileinputstream(file);14 bis = new bzip2compressorinputstream(fis);15 tis = new tarinputstream(bis, 1024 * 2);16 // 创建输出目录17 createdirectory(targetpath, null);18 tarentry entry;19 while((entry = tis.getnextentry()) != null){20 if(entry.isdirectory()){21 createdirectory(targetpath, entry.getname()); // 创建子目录22 }el{23 fos = new fileoutputstream(new file(targetpath + file.parator + entry.getname()));24 int count;25 byte data[] = new byte[2048];26 while ((count = tis.read(data)) != -1) {27 fos.write(data, 0, count);28 }29 fos.flush();30 }31 }32 } catch (ioexception e) {33 e.printstacktrace();34 }finally {35 try {36 if(fis != null){37 fis.clo();38 }39 if(fos != null){40 fos.clo();41 }42 if(bis != null){43 bis.clo();44 }45 if(tis != null){46 tis.clo();47 }48 } catch (ioexception e) {49 e.printstacktrace();50 }51 }52 }
tar.gz文件解压
如果想学习java工程化、高性能及分布式、深入浅出。微服务、spring,mybatis,netty源码分析的朋友可以加我的java高级交流:854630135,群里有阿里大牛直播讲解技术,以及java大型互联网技术的视频免费分享给大家。
1 /** 2 * 解压缩tar.gz文件 3 * @param file 压缩包文件 4 * @param targetpath 目标文件夹 5 * @param delete 解压后是否删除原压缩包文件 6 */ 7 private static void decompresstargz(file file, string targetpath, boolean delete){ 8 fileinputstream fileinputstream = null; 9 bufferedinputstream bufferedinputstream = null;10 gzipinputstream gzipin = null;11 tarinputstream tarin = null;12 outputstream out = null;13 try {14 fileinputstream = new fileinputstream(file);15 bufferedinputstream = new bufferedinputstream(fileinputstream);16 gzipin = new gzipinputstream(bufferedinputstream);17 tarin = new tarinputstream(gzipin, 1024 * 2);18 19 // 创建输出目录20 createdirectory(targetpath, null);21 22 tarentry entry = null;23 while((entry = tarin.getnextentry()) != null){24 if(entry.isdirectory()){ // 是目录25 createdirectory(targetpath, entry.getname()); // 创建子目录26 }el{ // 是文件27 file tempfile = new file(targetpath + file.parator + entry.getname());28 createdirectory(tempfile.getparent() + file.parator, null);29 out = new fileoutputstream(tempfile);30 int len =0;31 byte[] b = new byte[2048];32 33 while ((len = tarin.read(b)) != -1){34 out.write(b, 0, len);35 }36 out.flush();37 }38 }39 } catch (ioexception e) {40 e.printstacktrace();41 }finally {42 try {43 if(out !=介绍家乡的景物 null){44 out.clo();45 }46 if(tarin != null){47 tarin.clo();48 }49 if(gzipin != null){50 gzipin.clo();51 }52 if(bufferedinputstream != null){53 bufferedinputstream.clo();54 }55 if(fileinputstream != null){56 fileinputstream.clo();57 }58 } catch (ioexception e) {59 e.printstacktrace();60 }61 }62 }
gz文件解压
1 /** 2 * 解压缩gz文件 3 * @param file 压缩包文件 4 * @param targetpath 目标文件夹 5 * @param delete 解压后是否删除原压缩包文件 6 */ 7 private static void decompressgz(file file, string targetpath, boolean delete){ 8 fileinputstream fileinputstream = null; 9 gzipinputstream gzipin = null;10 outputstream out = null;11 string suffix = ".gz";12 try {13 fileinputstream = new fileinputstream(file);14 gzipin = new gzipinputstream(fileinputstream);15 // 创建输出目录16 createdirectory(targetpath, null);17 18 file tempfile = new file(targetpath + file.parator + file.getname().replace(suffix, ""));19 out = new fileoutputstream(tempfile);20 int count;21 byte data[] = new byte[2048];22 while ((count = gzipin.read(data)) != -1) {23 out.write(data, 0, count);24 }25 out.flush();26 } catch (ioexception e) {27 e.printstacktrace();28 }finally {29 try {30 if(out != null){31 out.clo();32 }33 if(gzipin != null){34 gzipin.clo();35 }36 if(fileinputstream != null){37 fileinputstream.clo();38 }39 } catch (ioexception e) {40 e.printstacktrace();41 }42 }43 }
7z文件解压
1 /** 2 * 解压缩7z文件 3 * @param file 压缩包文件 4 * @param targetpath 目标文件夹 5 * @param delete 解压后是否删除原压缩包文件 6 */ 7 private static void decompress7z(file file, string targetpath, boolean delete){ 8 venzfile venzfile = null; 9 outputstream outputstream = null;10 try {11 venzfile = new venzfile(file);12 // 创建输出目录13 createdirectory(targetpath, null);14 venzarchiveentry entry;15 16 while((entry = venzfile.getnextentry()) != null){17 if(entry.isdirectory()){18 createdirectory(targetpath, entry.getname()); // 创建子目录19 }el{20 outputstream = new fileoutputstream(new file(targetpath + file.parator + entry.getname()));21 int len = 0;22 byte[] b = new byte[2048];23 while((len = venzfile.read(b)) != -1){24 outputstream.write(b, 0, len);25 }26 outputstream.flush();27 }28 }29 } catch (ioexceptio薪酬管理工作总结n e) {30 e.printstacktrace();31 }finally {32 try {33 if(venzfile != null){34 venzfile.clo();35 }36 if(outputstream != null){37 outputstream.clo();38 }39 } catch (ioexception e) {40 e.printstacktrace();41 }42 }43 }
rar文件解压
先下载jar包:junrar-0.7.jar、xz-1.5.jar、commons-logging.jar
如果想学习java工程化、高性能及分布式、深入浅出。微服务、spring,mybatis,netty源码分析的朋友可以加我的java高级交流:854630135,群里有阿里大牛直播讲解技术,以及java大型互联网技术的视频免费分享给大家。
1 /** 2 * 解压缩rar文件 3 * @param file 压缩包文件 4 * @param targetpath 目标文件夹 5 * @param delete 解压后是否删除原压缩包文件 6 */ 7 private static void decompressrar(file file, string targetpath, boolean delete){ 8 archive archive = null; 9 outputstream outputstream = null;10 try {11 archive = new archive(file);12 fileheader fileheader;13 // 创建输出目录14 createdirectory(targetpath, null);15 while( (fileheader = archive.nextfileheader()) != null){16 if(fileheader.isdirectory()){17 createdirectory(targetpath, fileheader.getfilenamestring().trim()); // 创建子目录18 }el{19 outputstream = new fileoutputstream(new file(targetpath + file.parator + fileheader.getfilenamestring().trim()));20 archive.extractfile(fileheader, outputstream);21 }22 }23 } catch (rarexception | ioexception e) {24 e.printstacktrace();25 }finally {26 try {27 if(archive != null){28 archive.clo();29 }30 if(outputstream != null){31 outputstream.clo();32 }33 } catch (ioexception e) {34 e.printstacktrace();35 }36 }37 }
本文发布于:2023-04-05 15:05:44,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/0837eac4dd3a88c1684934a2cc134118.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:rar解压文件怎么打开(文件格式rar解压教程).doc
本文 PDF 下载地址:rar解压文件怎么打开(文件格式rar解压教程).pdf
留言与评论(共有 0 条评论) |