rar解压文件怎么打开(文件格式rar解压教程)
提醒:文章中有些片段看似代码很多,其实去除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, wave 12 }
这个类主要是用来将各种文件的类型集中管理,当然,不写这个类也是可以的,可以直接用字符串去表示。
然后,我还写了一个获取文件真实类型的方法
为什么要写这个方法呢?因为,我们是可以直接去修改文件的后缀的,这样很危险!
1 /** 2 * 获取文件真实类型 3 * 4 * @param file 要获取类型的文件。 5 * @return 文件类型枚举。 6 */ 7 private static filetype getfiletype(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 case 0x504b0304: 22 return filetype.zip; 23 case 0x776f7264: 24 return filetype.tar; 25 case -0x51: 26 return filetype._7z; 27 case 0x425a6839: 28 return filetype.bz2; 29 case -0x74f7f8: 30 return filetype.gz; 31 case 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.close(); 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.separator + 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 }else{ 26 fos = new fileoutputstream(new file(targetpath + file.separator + 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.close(); 41 } 42 if(fos != null){ 43 fos.close(); 44 } 45 if(tarinputstream != null){ 46 tarinputstream.close(); 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.separator + 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.close(); 32 } 33 if(fos != null){ 34 fos.close(); 35 } 36 if(bis != null){ 37 bis.close(); 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 }else{ 23 fos = new fileoutputstream(new file(targetpath + file.separator + 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.close(); 38 } 39 if(fos != null){ 40 fos.close(); 41 } 42 if(bis != null){ 43 bis.close(); 44 } 45 if(tis != null){ 46 tis.close(); 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 }else{ // 是文件 27 file tempfile = new file(targetpath + file.separator + entry.getname()); 28 createdirectory(tempfile.getparent() + file.separator, 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.close(); 45 } 46 if(tarin != null){ 47 tarin.close(); 48 } 49 if(gzipin != null){ 50 gzipin.close(); 51 } 52 if(bufferedinputstream != null){ 53 bufferedinputstream.close(); 54 } 55 if(fileinputstream != null){ 56 fileinputstream.close(); 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.separator + 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.close(); 32 } 33 if(gzipin != null){ 34 gzipin.close(); 35 } 36 if(fileinputstream != null){ 37 fileinputstream.close(); 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 sevenzfile sevenzfile = null; 9 outputstream outputstream = null; 10 try { 11 sevenzfile = new sevenzfile(file); 12 // 创建输出目录 13 createdirectory(targetpath, null); 14 sevenzarchiveentry entry; 15 16 while((entry = sevenzfile.getnextentry()) != null){ 17 if(entry.isdirectory()){ 18 createdirectory(targetpath, entry.getname()); // 创建子目录 19 }else{ 20 outputstream = new fileoutputstream(new file(targetpath + file.separator + entry.getname())); 21 int len = 0; 22 byte[] b = new byte[2048]; 23 while((len = sevenzfile.read(b)) != -1){ 24 outputstream.write(b, 0, len); 25 } 26 outputstream.flush(); 27 } 28 } 29 } catch (ioexception e) { 30 e.printstacktrace(); 31 }finally { 32 try { 33 if(sevenzfile != null){ 34 sevenzfile.close(); 35 } 36 if(outputstream != null){ 37 outputstream.close(); 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 }else{ 19 outputstream = new fileoutputstream(new file(targetpath + file.separator + 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.close(); 29 } 30 if(outputstream != null){ 31 outputstream.close(); 32 } 33 } catch (ioexception e) { 34 e.printstacktrace(); 35 } 36 } 37 }