欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

rar解压文件怎么打开(文件格式rar解压教程)

程序员文章站 2023-11-26 21:12:04
提醒:文章中有些片段看似代码很多,其实去除trycatch、释放资源真正有用的代码没几句,解压其实都很简单,主要用心去观察,都是依葫芦画瓢。首先,先写一个类似辅助的视图类如果想学习java工程化、高性...

提醒:文章中有些片段看似代码很多,其实去除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 }