package com.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import com.share.data.bean.FileType;
public class FileUtil {
/**
* 解压zip格式文件
*
* @param originFile zip文件。
* @param targetDir 要解压到的目标路径。
* @return 如果目标文件不是zip文件则返回false。
* @throws IOException 如果发生I/O错误。
*/
public static String decompressZip(File originFile, String targetDir) throws IOException {
String url = "";
if (FileType.ZIP != getFileType(originFile)) {
return "不支持的转换类型";
}
if (!targetDir.endsWith(File.separator)) {
targetDir += File.separator;
}
ZipFile zipFile = new ZipFile(originFile);
ZipEntry zipEntry;
Enumeration<ZipEntry> entry = (Enumeration<ZipEntry>) zipFile.entries();//getEntries();
while (entry.hasMoreElements()) {
zipEntry = entry.nextElement();
String fileName = zipEntry.getName();
url = targetDir+fileName;
File outputFile = new File(url);
if (zipEntry.isDirectory()) {
forceMkdirs(outputFile);
continue;
} else if (!outputFile.getParentFile().exists()) {
forceMkdirs(outputFile.getParent());
}
OutputStream outputStream = new FileOutputStream(outputFile);
InputStream inputStream = zipFile.getInputStream(zipEntry);
int len;
byte[] buffer = new byte[8192];
while (-1 != (len = inputStream.read(buffer))) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
inputStream.close();
}
zipFile.close();
return url;
}
/**
* 获取文件真实类型
*
* @param file 要获取类型的文件。
* @return 文件类型枚举。
*/
public static FileType getFileType(File file) throws IOException {
InputStream inputStream = new FileInputStream(file);
byte[] head = new byte[4];
if (-1 == inputStream.read(head)) {
return FileType.UNKNOWN;
}
inputStream.close();
int headHex = 0;
for (byte b : head) {
headHex <<= 8;
headHex |= b;
}
switch (headHex) {
case 0x504B0304:
return FileType.ZIP;
default:
return FileType.UNKNOWN;
}
}
@SuppressWarnings("ResultOfMethodCallIgnored")
public static File forceMkdirs(File file) {
if (!file.exists()) {
file.mkdirs();
} else if (!file.isDirectory()) {
file.delete();
file.mkdirs();
}
return file;
}
public static File forceMkdirs(String pathName) {
return forceMkdirs(new File(pathName));
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import com.share.data.bean.FileType;
public class FileUtil {
/**
* 解压zip格式文件
*
* @param originFile zip文件。
* @param targetDir 要解压到的目标路径。
* @return 如果目标文件不是zip文件则返回false。
* @throws IOException 如果发生I/O错误。
*/
public static String decompressZip(File originFile, String targetDir) throws IOException {
String url = "";
if (FileType.ZIP != getFileType(originFile)) {
return "不支持的转换类型";
}
if (!targetDir.endsWith(File.separator)) {
targetDir += File.separator;
}
ZipFile zipFile = new ZipFile(originFile);
ZipEntry zipEntry;
Enumeration<ZipEntry> entry = (Enumeration<ZipEntry>) zipFile.entries();//getEntries();
while (entry.hasMoreElements()) {
zipEntry = entry.nextElement();
String fileName = zipEntry.getName();
url = targetDir+fileName;
File outputFile = new File(url);
if (zipEntry.isDirectory()) {
forceMkdirs(outputFile);
continue;
} else if (!outputFile.getParentFile().exists()) {
forceMkdirs(outputFile.getParent());
}
OutputStream outputStream = new FileOutputStream(outputFile);
InputStream inputStream = zipFile.getInputStream(zipEntry);
int len;
byte[] buffer = new byte[8192];
while (-1 != (len = inputStream.read(buffer))) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
inputStream.close();
}
zipFile.close();
return url;
}
/**
* 获取文件真实类型
*
* @param file 要获取类型的文件。
* @return 文件类型枚举。
*/
public static FileType getFileType(File file) throws IOException {
InputStream inputStream = new FileInputStream(file);
byte[] head = new byte[4];
if (-1 == inputStream.read(head)) {
return FileType.UNKNOWN;
}
inputStream.close();
int headHex = 0;
for (byte b : head) {
headHex <<= 8;
headHex |= b;
}
switch (headHex) {
case 0x504B0304:
return FileType.ZIP;
default:
return FileType.UNKNOWN;
}
}
@SuppressWarnings("ResultOfMethodCallIgnored")
public static File forceMkdirs(File file) {
if (!file.exists()) {
file.mkdirs();
} else if (!file.isDirectory()) {
file.delete();
file.mkdirs();
}
return file;
}
public static File forceMkdirs(String pathName) {
return forceMkdirs(new File(pathName));
}
}
//枚举类FileType
public enum FileType {
ZIP,UNKNOWN,
}