如何基于java实现解压ZIP TAR等文件

2025-05-29 0 33

  java实现对常用.ZIP , .TAR, .TAR.BZ2, .BZ2 ,.TAR.GZ ,.GZ格式文件的解压

  首先需要引入maven依赖,这里使用的是Apache的压缩工具包common-compress,改工具包支持解压、压缩,此代码中我列举出一个zip的压缩示例,其他格式的只需切换改格式对应的流即可。

对于RAR格式文件的解压,目前该工具包还不支持,希望大家做过的可以多多交流。

?

1

2

3

4
<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-compress</artifactId>

<version>1.19</version></dependency>

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;

import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;

import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;

import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;

import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;

import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;

import org.apache.commons.compress.utils.IOUtils;

import java.io.*;

/**

* @author :zhangzhiyong

* @description: java实现常见文件格式的解压与压缩

* 支持.ZIP .TAR .TAR.BZ2 .BZ2 .TAR.GZ .GZ

* 其他格式compress包也支持,在此基础上开发即可

* 另外压缩文件只写了ZIP压缩的方法zipCompression,其他的格式类似,换成对应的文件流即可。

* 暂不支持RAR压缩格式,RAR可以用junrar的工具包,但是有缺陷:

* 其一:如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码,但是不影响文件夹里面的文件;

* 其二:最新 WinRar 压缩产生的 .rar 文件可能会无法解压。

* 缺陷原因:rar 有版权,有些东西没有公开,对解压有一些限制,即使其他解压包也可能有问题,但是建议尝试。

* @date :2020/7/1 20:44

*/

public class CompressionFileUtil {

/**

* @param filePath 需要解压的zip文件的完成路径。

* @param unzipPath 解压过后生成文件的存放路径

* @description: 对zip文件进行解压。

* @return: boolean

* @author: ZZY

* @time: 2020/7/2 14:47

*/

public static boolean zipUnCompress(String filePath, String unzipPath) throws IOException {

System.out.println("开始解压ZIP..........");

FileInputStream fis = null;

ZipArchiveInputStream zis = null;

try {

File file = new File(filePath);

fis = new FileInputStream(file);

zis = new ZipArchiveInputStream(fis);

ZipArchiveEntry nze = null;

while ((nze = zis.getNextZipEntry()) != null) {

FileOutputStream os = null;

BufferedOutputStream bos = null;

try {

System.out.println("正在解压....." + nze.getName());

//自动添加File.separator文件路径的分隔符,根据系统判断是\\\\还是/

String dir = unzipPath + File.separator + nze.getName(); //解压全路径

System.out.println("dir---" + dir);

File file1 = null;

if (nze.isDirectory()) {

file1 = new File(dir);

file1.mkdirs();

} else {

file1 = new File(dir);

os = new FileOutputStream(file1);

bos = new BufferedOutputStream(os);

/*byte [] bt = new byte[1024];

int len = 0;

while((len = zis.read(bt,0,1024)) != -1){

bos.write(bt,0,len);

}*/

IOUtils.copy(zis, bos); //作用与上面注释代码一样

}

System.out.println("解压完成......");

} catch (FileNotFoundException e) {

e.printStackTrace();

return false;

} finally {

if (bos != null) {

bos.close();

}

if (os != null) {

os.close();

}

}

}

} catch (Exception e) {

e.printStackTrace();

return false;

} finally {

if (zis != null) {

zis.close();

}

if (fis != null) {

fis.close();

}

}

return true;

}

/**

* @param filesPathArray 多个文件的绝对路径,是一个数组。

* @param zipFilePath 生成的压缩文件的位置,包括生成的文件名,如D:\\zip\\test.zip

* @description: 将多个文件压缩成ZIP压缩包。

* @return: boolean

* @author: ZZY

* @time: 2020/7/2 14:42

*/

public static boolean zipCompression(String[] filesPathArray, String zipFilePath) throws Exception {

System.out.println("开始压缩ZIP文件");

ZipArchiveOutputStream zos = null;

FileOutputStream fos = null;

try {

fos = new FileOutputStream(new File(zipFilePath));

zos = new ZipArchiveOutputStream(fos);

for (String filePath : filesPathArray) {

FileInputStream fis = null;

BufferedInputStream bis = null;

try {

File file = new File(filePath);

// 第二个参数如果是文件全路径名,那么压缩时也会将路径文件夹也缩进去;

// 我们只压缩目标文件,而不压缩该文件所处位置的相关文件夹,所以这里我们用file.getName()

System.out.println("开始压缩..." + file.getName());

ZipArchiveEntry zae = new ZipArchiveEntry(file, file.getName());

zos.putArchiveEntry(zae);

fis = new FileInputStream(file);

bis = new BufferedInputStream(fis);

int count;

byte[] bt = new byte[1024];

while ((count = bis.read(bt, 0, 1024)) != -1) {

zos.write(bt, 0, count);

}

} finally {

zos.closeArchiveEntry();

if (bis != null)

bis.close();

if (fis != null)

fis.close();

}

}

} finally {

if (zos != null)

zos.close();

if (fos != null)

fos.close();

}

System.out.println("压缩完成......");

return true;

}

/**

* @param inputStream 每种TAR文件用不同的输入流,unCompress方法中已注明

* @param unTarPath TAR文件解压后的存放路径

* @description: 解压TAR类文件,包括.TAR .TAR.BZ2 .TAR.GZ

* @return: void

* @author: ZZY

* @time: 2020/7/2 17:42

*/

public static void unTar(InputStream inputStream, String unTarPath) throws IOException {

FileInputStream fis = null;

TarArchiveInputStream tis = null;

try {

tis = new TarArchiveInputStream(inputStream);

TarArchiveEntry nte = null;

System.out.println("开始解压......");

while ((nte = tis.getNextTarEntry()) != null) {

String dir = unTarPath + File.separator + nte.getName();

System.out.println("正在解压......" + dir);

FileOutputStream fos = null;

BufferedOutputStream bos = null;

try {

if (nte.isDirectory()) {

File file1 = new File(dir);

file1.mkdirs();

} else {

File file2 = new File(dir);

fos = new FileOutputStream(file2);

bos = new BufferedOutputStream(fos);

IOUtils.copy(tis, bos);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (bos != null) {

bos.close();

}

if (fos != null) {

fos.close();

}

}

}

System.out.println("解压完成......");

} catch (IOException e) {

e.printStackTrace();

} finally {

if (tis != null) {

tis.close();

}

if (fis != null) {

fis.close();

}

}

}

public static boolean unCompress(String filePath,String unCompressPath) throws Exception {

String fileType = filePath.toUpperCase();

if(fileType.endsWith(".TAR")){

System.out.println("解压的.TAR包");

//.TAR包用一般的FileInputStream流读取

unTar(new FileInputStream(filePath),unCompressPath);

}

else if(fileType.endsWith(".TAR.GZ")){

System.out.println("解压的.TAR.GZ包");

//.TAR.GZ包要用GzipCompressorInputStream读取

unTar(new GzipCompressorInputStream(new FileInputStream(filePath)),unCompressPath);

}

else if(fileType.endsWith(".TAR.BZ2")){

System.out.println("解压的.TAR.BZ2包");

unTar(new BZip2CompressorInputStream(new FileInputStream(filePath)),unCompressPath);

}

else if(fileType.endsWith(".ZIP")){

System.out.println("解压的.ZIP包");

zipUnCompress(filePath,unCompressPath);

}

else{

System.out.println("暂不支持该种格式文件的解压");

}

return true;

}

public static void main(String[] args) throws Exception {

unCompress("D:\\\\test\\\\zip\\\\nginx-1.18.0.rar","D:\\\\test\\\\zip");

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://www.cnblogs.com/zhangzhiyong-/p/13233920.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 如何基于java实现解压ZIP TAR等文件 https://www.kuaiidc.com/119510.html

相关文章

发表评论
暂无评论