压缩为7z文件
首先网络上对7z的压缩内容很少。
尤其是java调用进行压缩的是更少了。
一下是自己完成的一个压缩。
本人进行了测试是成功的。
将压缩的流写如磁盘一个压缩文件中。
然后使用7z的压缩软件进行打开解压。
7-zip的开源项目7-zip-JBinding项目地址(sourceforge)
不多说,调用7z源码进行压缩的方法如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public byte [] lzmaZip(String xml) throws IOException{
BufferedInputStream inStream = new BufferedInputStream( new ByteArrayInputStream(xml.getBytes()));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
boolean eos = true ;
Encoder encoder = new Encoder();
encoder.SetEndMarkerMode(eos);
encoder.WriteCoderProperties(bos);
long fileSize = xml.length();
if (eos)
fileSize = - 1 ;
for ( int i = 0 ; i < 8 ; i++)
bos.write(( int )(fileSize >>> ( 8 * i)) & 0xFF );
encoder.Code(inStream, bos, - 1 , - 1 , null );
return bos.toByteArray() ;
}
|
解压缩7z文件
利用7-zip的开源项目7-zip-JBinding来解压缩多种压缩文件,而不是调用外部命令(比如win下调用winrar)。
java自带的解压模块可解压缩的压缩类型有限。
代码示例
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
|
package core;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import net.sf.sevenzipjbinding.ExtractOperationResult;
import net.sf.sevenzipjbinding.ISequentialOutStream;
import net.sf.sevenzipjbinding.ISevenZipInArchive;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
import net.sf.sevenzipjbinding.simple.ISimpleInArchive;
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
/**利用7zbinding*/
public class UnZip {
void extractile(String filepath){
RandomAccessFile randomAccessFile = null ;
ISevenZipInArchive inArchive = null ;
try {
randomAccessFile = new RandomAccessFile(filepath, "r" );
inArchive = SevenZip.openInArchive( null , // autodetect archive type
new RandomAccessFileInStream(randomAccessFile));
// Getting simple interface of the archive inArchive
ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();
System.out.println( " Hash | Size | Filename" );
System.out.println( "----------+------------+---------" );
for ( final ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) {
final int [] hash = new int [] { 0 };
if (!item.isFolder()) {
ExtractOperationResult result;
final long [] sizeArray = new long [ 1 ];
result = item.extractSlow( new ISequentialOutStream() {
public int write( byte [] data) throws SevenZipException {
//Write to file
FileOutputStream fos;
try {
File file = new File(item.getPath());
//error occours below
// file.getParentFile().mkdirs();
fos = new FileOutputStream(file);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
hash[ 0 ] ^= Arrays.hashCode(data); // Consume data
sizeArray[ 0 ] += data.length;
return data.length; // Return amount of consumed data
}
});
if (result == ExtractOperationResult.OK) {
System.out.println(String.format( "%9X | %10s | %s" , //
hash[ 0 ], sizeArray[ 0 ], item.getPath()));
} else {
System.err.println( "Error extracting item: " + result);
}
}
}
} catch (Exception e) {
System.err.println( "Error occurs: " + e);
e.printStackTrace();
System.exit( 1 );
} finally {
if (inArchive != null ) {
try {
inArchive.close();
} catch (SevenZipException e) {
System.err.println( "Error closing archive: " + e);
}
}
if (randomAccessFile != null ) {
try {
randomAccessFile.close();
} catch (IOException e) {
System.err.println( "Error closing file: " + e);
}
}
}
}
}
|
调用的时候:
1
2
|
unzip= new UnZip();
unzip.extractile( "a.7z" );
|
会自动解压缩压缩包里的文件到当前目录下,当然可以更改设置,到特定的目录。代码简单明确。有问题可以到上面的sourceforge项目地址下的discuss搜索。