java解压缩中文不乱码 apache compress
- 摘要:packagemain.util;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.IOException;importjava.util.Enumeration;importorg.apache.commons.compress
- 标签:Java 压缩 解压缩 Apache
monospace !important; font-weight: bold !important; line-height: 1.1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; float: none !important; height: auto !important; overflow: visible !important; vertical-align: baseline !important; width: auto !important; color: #006699 !important;" class="java keyword">package
main.util;
?
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.InputStream;
import
java.io.IOException;
import
java.util.Enumeration;
import
org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import
org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import
org.apache.commons.compress.archivers.zip.ZipFile;
import
org.apache.commons.compress.utils.IOUtils;
?
/**
?
* Utility to Zip and Unzip nested directories recursively.
?
* @author Robin Spark
?
*/
public
class
ZipUtil {
?
????
/**
?????
* Creates a zip file at the specified path with the contents of the specified directory.
?????
* NB:
?????
*
?????
* @param directoryPath The path of the directory where the archive will be created. eg. c:/temp
?????
* @param zipPath The full path of the archive to create. eg. c:/temp/archive.zip
?????
* @throws IOException If anything goes wrong
?????
*/
????
public
static
void
createZip(String directoryPath, String zipPath)
throws
IOException {
????????
FileOutputStream fOut =
null
;
????????
BufferedOutputStream bOut =
null
;
????????
ZipArchiveOutputStream tOut =
null
;
?
????????
try
{
????????????
fOut =
new
FileOutputStream(
new
File(zipPath));
????????????
bOut =
new
BufferedOutputStream(fOut);
????????????
tOut =
new
ZipArchiveOutputStream(bOut);
????????????
addFileToZip(tOut, directoryPath,
""
);
????????
}
finally
{
????????????
tOut.finish();
????????????
tOut.close();
????????????
bOut.close();
????????????
fOut.close();
????????
}
?
????
}
?
????
/**
?????
* Creates a zip entry for the path specified with a name built from the base passed in and the file/directory
?????
* name. If the path is a directory, a recursive call is made such that the full directory is added to the zip.
?????
*
?????
* @param zOut The zip file's output stream
?????
* @param path The filesystem path of the file/directory being added
?????
* @param base The base prefix to for the name of the zip file entry
?????
*
?????
* @throws IOException If anything goes wrong
?????
*/
????
private
static
void
addFileToZip(ZipArchiveOutputStream zOut, String path, String base)
throws
IOException {
????????
File f =
new
File(path);
????????
String entryName = base + f.getName();
????????
ZipArchiveEntry zipEntry =
new
ZipArchiveEntry(f, entryName);
?
????????
zOut.putArchiveEntry(zipEntry);
?
????????
if
(f.isFile()) {
????????????
FileInputStream fInputStream =
null
;
????????????
try
{
????????????????
fInputStream =
new
FileInputStream(f);
????????????????
IOUtils.copy(fInputStream, zOut);
????????????????
zOut.closeArchiveEntry();
????????????
}
finally
{
????????????????
IOUtils.closeQuietly(fInputStream);
????????????
}
?
????????
}
else
{
????????????
zOut.closeArchiveEntry();
????????????
File[] children = f.listFiles();
?
????????????
if
(children !=
null
) {
????????????????
for
(File child : children) {
????????????????????
addFileToZip(zOut, child.getAbsolutePath(), entryName +
"/"
);
????????????????
}
????????????
}
????????
}
????
}
?
????
/**
?????
* Extract zip file at the specified destination path.
?????
* NB:archive must consist of a single root folder containing everything else
?????
*
?????
* @param archivePath path to zip file
?????
* @param destinationPath path to extract zip file to. Created if it doesn't exist.
?????
*/
????
public
static
void
extractZip(String archivePath, String destinationPath) {
????????
File archiveFile =
new
File(archivePath);
????????
File unzipDestFolder =
null
;
?
????????
try
{
????????????
unzipDestFolder =
new
File(destinationPath);
????????????
String[] zipRootFolder =
new
String[]{
null
};
????????????
unzipFolder(archiveFile, archiveFile.length(), unzipDestFolder, zipRootFolder);
????????
}
catch
(Exception e) {
????????????
e.printStackTrace();
????????
}
????
}
?
????
/**
?????
* Unzips a zip file into the given destination directory.
?????
*
?????
* The archive file MUST have a unique "root" folder. This root folder is
?????
* skipped when unarchiving.
?????
*
?????
* @return true if folder is unzipped correctly.
?????
*/
????
@SuppressWarnings
(
"unchecked"
)
????
private
static
boolean
unzipFolder(File archiveFile,
????????????
long
compressedSize,
????????????
File zipDestinationFolder,
????????????
String[] outputZipRootFolder) {
?
????????
ZipFile zipFile =
null
;
????????
try
{
????????????
zipFile =
new
ZipFile(archiveFile);
????????????
byte
[] buf =
new
byte
[
65536
];
?
????????????
Enumeration entries = zipFile.getEntries();
????????????
while
(entries.hasMoreElements()) {
????????????????
ZipArchiveEntry zipEntry = entries.nextElement();
????????????????
String name = zipEntry.getName();
????????????????
name = name.replace(
'\\'
,
'/'
);
????????????????
int
i = name.indexOf(
'/'
);
????????????????
if
(i >
0
) {
????????????????????????
outputZipRootFolder[
0
] = name.substring(
0
, i);
????????????????????
}
????????????????????
name = name.substring(i +
1
);
????????????????
}
?
????????????????
File destinationFile =
new
File(zipDestinationFolder, name);
????????????????
if
(name.endsWith(
"/"
)) {
????????????????????
if
(!destinationFile.isDirectory() && !destinationFile.mkdirs()) {
????????????????????????
log(
"Error creating temp directory:"
+ destinationFile.getPath());
????????????????????????
return
false
;
????????????????????
}
????????????????????
continue
;
????????????????
}
else
if
(name.indexOf(
'/'
) != -
1
) {
????????????????????
????????????????????
File parentFolder = destinationFile.getParentFile();
????????????????????
if
(!parentFolder.isDirectory()) {
????????????????????????
if
(!parentFolder.mkdirs()) {
????????????????????????????
log(
"Error creating temp directory:"
+ parentFolder.getPath());
????????????????????????????
return
false
;
????????????????????????
}
????????????????????
}
????????????????
}
?
????????????????
FileOutputStream fos =
null
;
????????????????
try
{
????????????????????
fos =
new
FileOutputStream(destinationFile);
????????????????????
int
n;
????????????????????
InputStream entryContent = zipFile.getInputStream(zipEntry);
????????????????????
while
((n = entryContent.read(buf)) != -
1
) {
????????????????????????
if
(n >
0
) {
????????????????????????????
fos.write(buf,
0
, n);
????????????????????????
}
????????????????????
}
????????????????
}
finally
{
????????????????????
if
(fos !=
null
) {
????????????????????????
fos.close();
????????????????????
}
????????????????
}
????????????
}
????????????
return
true
;
?
????????
}
catch
(IOException e) {
????????????
log(
"Unzip failed:"
+ e.getMessage());
????????
}
finally
{
????????????
if
(zipFile !=
null
) {
????????????????
try
{
????????????????????
zipFile.close();
????????????????
}
catch
(IOException e) {
????????????????????
log(
"Error closing zip file"
);
????????????????
}
????????????
}
????????
}
?
????????
return
false
;
????
}
?
????
private
static
void
log(String msg) {
????????
System.out.println(msg);
????
}
?
????
/**
?????
* Method for testing zipping and unzipping.
?????
* @param args
?????
*/
????
public
static
void
main(String[] args)
throws
IOException {
????????
createZip(
"c:/temp/99/target"
,
"c:/temp/99/output2.zip"
);
????????
extractZip(
"c:/temp/99/output2.zip"
,
"c:/temp/99/1"
);
????
}
}