import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;
/**
* 文件工具类
*
* 需要Apache commons-io.jar和commons-fileupload.jar的支持
*/
public class FileUtil {
/**
* 私有构造为了不让直接创建一个FileUtil实例
*/
private FileUtil() {
}
/**
* 查询某个目录下指定扩展名的文件
*
* @param dir
* 目录
* @param suffixs
* 扩展名数组
* @return
*/
public static String[] find(String dir, String[] suffixs) {
File d = new File(dir);
return d.list(new SuffixFileFilter(suffixs));
}
/**
* 返回文件或目录的size
*
* @param file
* 文件或目录
* @return size 以byte为单位
*/
public static long size(String file) {
File f = new File(file);
if (f.isDirectory()) {
return FileUtils.sizeOfDirectory(f);
}
return f.length();
}
/**
* 拷贝文件到文件或者目录
*
* @param src
* 源文件
* @param dest
* 目的文件或目录
*/
public static void copy(String src, String dest) {
try {
File s = new File(src);
File d = new File(dest);
int index = dest.indexOf(".");
if (index == -1) {
FileUtils.copyFileToDirectory(s, d);
} else {
FileUtils.copyFile(s, d);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 移动文件到文件或者目录
*
* @param src
* 源文件
* @param dest
* 目的文件或目录
*/
public static void move(String src, String dest) {
copy(src, dest);
File f = new File(src);
f.delete();
}
/**
* 删除文件或目录
*
* @param path
* 文件或目录的路径
*/
public static void delete(String path) {
try {
File f = new File(path);
if (f.exists() && f.isFile()) {
f.delete();
}
if (f.exists() && f.isDirectory()) {
FileUtils.deleteDirectory(f);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 清空目录
*
* @param path
* 目录的路径
*/
public static void clean(String dir) {
try {
File f = new File(dir);
FileUtils.cleanDirectory(f);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 写字符串内容到文件
*
* @param content
* 字符串内容
* @param dest
* 目的文件
*/
public static void write(String content, String dest) {
try {
File d = new File(dest);
FileUtils.writeStringToFile(d, content, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取文件的内容
*
* @param file文件
* @return 字符串内容
*/
public static String read(String file) {
InputStream in = null;
String content = null;
try {
in = new FileInputStream(file);
content = IOUtils.toString(in, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(in);
}
return content;
}
/**
* 压缩文件夹
*
* @param folder
* 文件夹
* @param target
* 目标压缩文件
*/
public static void zip(String folder, String target) {
ZipOutputStream out = null;
try {
out = new ZipOutputStream(new FileOutputStream(target));
File fileOrDirectory = new File(folder);
if (fileOrDirectory.isFile()) {
zipFileOrDirectory(out, fileOrDirectory, "");
} else {
File[] entries = fileOrDirectory.listFiles();
for (int i = 0; i < entries.length; i++) {
zipFileOrDirectory(out, entries[i], "");
}
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
}
}
}
}
/**
* 递归压缩文件或目录
*
* @param out
* 压缩输出流对象
* @param fileOrDirectory
* 要压缩的文件或目录对象
* @param curPath
* 当前压缩条目的路径,用于指定条目名称的前缀
*/
private static void zipFileOrDirectory(ZipOutputStream out,
File fileOrDirectory, String curPath) {
FileInputStream in = null;
try {
if (!fileOrDirectory.isDirectory()) {
byte[] buffer = new byte[4096];
int bytes_read;
in = new FileInputStream(fileOrDirectory);
ZipEntry entry = new ZipEntry(curPath
+ fileOrDirectory.getName());
out.putNextEntry(entry);
while ((bytes_read = in.read(buffer)) != -1) {
out.write(buffer, 0, bytes_read);
}
out.closeEntry();
} else {
File[] entries = fileOrDirectory.listFiles();
for (int i = 0; i < entries.length; i++) {
zipFileOrDirectory(out, entries[i], curPath
+ fileOrDirectory.getName() + File.separator);
}
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
}
}
}
}
/**
* 解压缩文件夹
*
* @param zip
* 压缩文件
* @param folder
* 目标压缩文件
*/
public static void unzip(String zip, String folder) {
try {
File z = new File(zip);
File f = new File(folder);
ZipInputStream zis = new ZipInputStream(new FileInputStream(z));
FileOutputStream fos = null;
ZipEntry entry = null;
int b;
while ((entry = zis.getNextEntry()) != null) {
File file = new File(f, entry.getName());
if (entry.isDirectory()) {
file.mkdirs();
} else {
fos = new FileOutputStream(file);
while ((b = zis.read()) != -1) {
fos.write(b);
}
fos.close();
}
}
zis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static void upload(HttpServletRequest request, String dir) {
long MAXSIZE = 1024 * 1024;
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(MAXSIZE);
try {
List list = upload.parseRequest(request);
if (list.size() > 0) {
File d = new File(dir);
if (!d.exists()) {
d.mkdirs();
}
for (int i = 0; i < list.size(); i++) {
FileItem fileItem = (FileItem) list.get(i);
if (fileItem.getSize() > 0) {
String fileName = fileItem.getName();
int index = fileName.lastIndexOf(File.separatorChar);
String name = fileName.substring(index + 1);
fileItem
.write(new File(dir + File.separatorChar + name));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// System.out.println(read("d:/aaa/adduser.xml"));
// write("aaa", "d:/aaa/adduser.txt");
// delete("d:/aaa/cccc");
// copy("d:/aaa/adduser.xml", "d:/eee/aaa.xml");
// move("d:/aaa/adduser.txt", "d:/aaa/adduser1.txt");
// System.out.println(size("d:/aaa"));
// String[] kk = find("d:/aaa", new String[] { "txt", "sql" });
// for (String string : kk) {
// System.out.println(string);
// }
// zip("d:/aaaa", "d:/aaakkk.zip");
// unzip("d:/aaakkk.zip", "d:/ccc");
}
}