import java.io.File; |
import java.io.FileInputStream; |
import java.io.FileOutputStream; |
import java.io.IOException; |
import java.io.InputStream; |
import java.util.Enumeration; |
import org.apache.tools.zip.ZipEntry; |
import org.apache.tools.zip.ZipFile; |
import org.apache.tools.zip.ZipOutputStream; |
import org.slf4j.Logger; |
import org.slf4j.LoggerFactory; |
/** |
* 压缩,解压,删除,拷贝操作。 |
* 注意:此类中用到的压缩类ZipEntry等都来自于org.apache.tools包而非java.util。此包在ant.jar中有。 |
* |
* * @author Tony |
*/ |
public class FileUtil { |
protected static Logger log = LoggerFactory.getLogger(FileUtil. class ); |
/** |
* |
* 压缩文件 |
* |
* @param inputFileName |
* 要压缩的文件或文件夹路径,例如:c:\\a.txt,c:\\a\ |
* |
* @param outputFileName |
* 输出zip文件的路径,例如:c:\\a.zip |
* |
*/ |
public static void zip(String inputFileName, String outputFileName) |
throws Exception { |
ZipOutputStream out = new ZipOutputStream( new FileOutputStream( |
outputFileName)); |
zip(out, new File(inputFileName), "" ); |
log.debug( "压缩完成!" ); |
out.closeEntry(); |
out.close(); |
} |
/** |
* |
* 压缩文件 |
* |
* @param out |
* org.apache.tools.zip.ZipOutputStream |
* |
* @param file |
* 待压缩的文件 |
* |
* @param base |
* 压缩的根目录 |
* |
*/ |
private static void zip(ZipOutputStream out, File file, String base) |
throws Exception { |
if (file.isDirectory()) { |
File[] fl = file.listFiles(); |
base = base.length() == 0 ? "" : base + File.separator; |
for ( int i = 0 ; i < fl.length; i++) { |
zip(out, fl[i], base + fl[i].getName()); |
} |
} else { |
out.putNextEntry( new ZipEntry(base)); |
log.debug( "添加压缩文件:" + base); |
FileInputStream in = new FileInputStream(file); |
int b; |
while ((b = in.read()) != - 1 ) { |
out.write(b); |
} |
in.close(); |
} |
} |
/** |
* |
* 解压zip文件 |
* |
* @param zipFileName |
* 待解压的zip文件路径,例如:c:\\a.zip |
* |
* @param outputDirectory |
* 解压目标文件夹,例如:c:\\a\ |
* |
*/ |
public static void unZip(String zipFileName, String outputDirectory) |
throws Exception { |
ZipFile zipFile = new ZipFile(zipFileName); |
try { |
Enumeration<?> e = zipFile.getEntries(); |
ZipEntry zipEntry = null ; |
createDirectory(outputDirectory, "" ); |
while (e.hasMoreElements()) { |
zipEntry = (ZipEntry) e.nextElement(); |
log.debug( "解压:" + zipEntry.getName()); |
if (zipEntry.isDirectory()) { |
String name = zipEntry.getName(); |
name = name.substring( 0 , name.length() - 1 ); |
File f = new File(outputDirectory + File.separator + name); |
f.mkdir(); |
log |
.debug( "创建目录:" + outputDirectory + File.separator |
+ name); |
} else { |
String fileName = zipEntry.getName(); |
fileName = fileName.replace( '\\' , '/' ); |
if (fileName.indexOf( "/" ) != - 1 ) { |
createDirectory(outputDirectory, fileName.substring( 0 , |
fileName.lastIndexOf( "/" ))); |
fileName = fileName.substring( |
fileName.lastIndexOf( "/" ) + 1 , fileName |
.length()); |
} |
File f = new File(outputDirectory + File.separator |
+ zipEntry.getName()); |
f.createNewFile(); |
InputStream in = zipFile.getInputStream(zipEntry); |
FileOutputStream out = new FileOutputStream(f); |
byte [] by = new byte [ 1024 ]; |
int c; |
while ((c = in.read(by)) != - 1 ) { |
out.write(by, 0 , c); |
} |
in.close(); |
out.close(); |
} |
} |
} catch (Exception ex) { |
System.out.println(ex.getMessage()); |
} finally { |
zipFile.close(); |
log.debug( "解压完成!" ); |
} |
} |
/** |
* 功能描述:列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤 |
* |
* @param path |
* 文件 |
*/ |
public static void list(File path) { |
if (!path.exists()) { |
System.out.println( "文件名称不存?" ); |
} else { |
if (path.isFile()) { |
if (path.getName().toLowerCase().endsWith( ".pdf" ) |
|| path.getName().toLowerCase().endsWith( ".doc" ) |
|| path.getName().toLowerCase().endsWith( ".chm" ) |
|| path.getName().toLowerCase().endsWith( ".html" ) |
|| path.getName().toLowerCase().endsWith( ".htm" )) { // 文件格式 |
System.out.println(path); |
System.out.println(path.getName()); |
} |
} else { |
File[] files = path.listFiles(); |
for ( int i = 0 ; i < files.length; i++) { |
list(files[i]); |
} |
} |
} |
} |
/** |
* |
* @param directory |
* @param subDirectory |
*/ |
private static void createDirectory(String directory, String subDirectory) { |
String dir[]; |
File fl = new File(directory); |
try { |
if (subDirectory == "" && fl.exists() != true ) { |
fl.mkdir(); |
} else if (subDirectory != "" ) { |
dir = subDirectory.replace( '\\' , '/' ).split( "/" ); |
for ( int i = 0 ; i < dir.length; i++) { |
File subFile = new File(directory + File.separator + dir[i]); |
if (subFile.exists() == false ) |
subFile.mkdir(); |
directory += File.separator + dir[i]; |
} |
} |
} catch (Exception ex) { |
System.out.println(ex.getMessage()); |
} |
} |
/** |
* |
* 拷贝文件夹中的所有文件到另外一个文件夹 |
* |
* @param srcDirector |
* 源文件夹 |
* |
* @param desDirector |
* 目标文件夹 |
* |
*/ |
public static void copyFileWithDirector(String srcDirector, |
String desDirector) throws IOException { |
( new File(desDirector)).mkdirs(); |
File[] file = ( new File(srcDirector)).listFiles(); |
for ( int i = 0 ; i < file.length; i++) { |
if (file[i].isFile()) { |
log.debug( "拷贝:" + file[i].getAbsolutePath() + "-->" |
+ desDirector + "/" + file[i].getName()); |
FileInputStream input = new FileInputStream(file[i]); |
FileOutputStream output = new FileOutputStream(desDirector |
+ "/" + file[i].getName()); |
byte [] b = new byte [ 1024 * 5 ]; |
int len; |
while ((len = input.read(b)) != - 1 ) { |
output.write(b, 0 , len); |
} |
output.flush(); |
output.close(); |
input.close(); |
} |
if (file[i].isDirectory()) { |
log.debug( "拷贝:" + file[i].getAbsolutePath() + "-->" |
+ desDirector + "/" + file[i].getName()); |
copyFileWithDirector(srcDirector + "/" + file[i].getName(), |
desDirector + "/" + file[i].getName()); |
} |
} |
} |
/** |
* |
* 删除文件夹 |
* |
* @param folderPath |
* folderPath 文件夹完整绝对路径 |
* |
*/ |
public static void delFolder(String folderPath) throws Exception { |
// 删除完里面所有内容 |
delAllFile(folderPath); |
String filePath = folderPath; |
filePath = filePath.toString(); |
File myFilePath = new File(filePath); |
// 删除空文件夹 |
myFilePath.delete(); |
} |
/** |
* |
* 删除指定文件夹下所有文件 |
* |
* @param path |
* 文件夹完整绝对路径 |
* |
*/ |
public static boolean delAllFile(String path) throws Exception { |
boolean flag = false ; |
File file = new File(path); |
if (!file.exists()) { |
return flag; |
} |
if (!file.isDirectory()) { |
return flag; |
} |
String[] tempList = file.list(); |
File temp = null ; |
for ( int i = 0 ; i < tempList.length; i++) { |
if (path.endsWith(File.separator)) { |
temp = new File(path + tempList[i]); |
} else { |
temp = new File(path + File.separator + tempList[i]); |
} |
if (temp.isFile()) { |
temp.delete(); |
} |
if (temp.isDirectory()) { |
// 先删除文件夹里面的文件 |
delAllFile(path + "/" + tempList[i]); |
// 再删除空文件夹 |
delFolder(path + "/" + tempList[i]); |
flag = true ; |
} |
} |
return flag; |
} |
/** |
* @param args |
*/ |
public static void main(String[] args) { |
// TODO Auto-generated method stub |
File file = new File( "H:\\" ); |
list(file); |
} |
} |