java文件操作类,简单封装,封装了复制,剪切,删除目录,压缩解压zip,等常用功能
package com.wiker;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* @author Wiker Yong Email:<a href="mailto:wikeryong@gmail.com">wikeryong@gmail.com</a>
* @date 2013-11-8 下午6:21:45
* @version 1.0-SNAPSHOT
*/
@SuppressWarnings("resource")
public class FileUtils {
/**
* 获取文件MD5值
*
* @param file
* @return
*/
public static String getMd5ByFile(File file) {
String value = null;
FileInputStream in = null;
try {
in = new FileInputStream(file);
MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0,
file.length());
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest());
value = bi.toString(16);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return value;
}
/**
* 获取文件大小
*
* @param file
* @return
*/
public static long getFileLength(File file)
throws IOException {
FileInputStream fis = null;
fis = new FileInputStream(file);
return fis.available();
}
/**
* 读取文件到二进制
*
* @author WikerYong Email:<a href="#">yw_312@foxmail.com</a>
* @version 2012-3-23 上午11:47:06
* @param file
* @return
* @throws IOException
*/
public static byte[] getBytesFromFile(File file)
throws IOException {
InputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
// File is too large
}
byte[] bytes = new byte[(int) length];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("不能读取文件: " + file.getName());
}
is.close();
return bytes;
}
/**
* 获取标准文件大小,如30KB,15.5MB
*
* @param file
* @return
* @throws IOException
*/
public static String getFileSize(File file)
throws IOException {
long size = getFileLength(file);
DecimalFormat df = new DecimalFormat("###.##");
float f;
if (size < 1024 * 1024) {
f = (float) ((float) size / (float) 1024);
return (df.format(new Float(f).doubleValue()) + " KB");
} else {
f = (float) ((float) size / (float) (1024 * 1024));
return (df.format(new Float(f).doubleValue()) + " MB");
}
}
/**
* 复制文件
*
* @param f1
* 源文件
* @param f2
* 目标文件
* @throws Exception
*/
public static void copyFile(File f1, File f2)
throws Exception {
int length = 2097152;
FileInputStream in = new FileInputStream(f1);
FileOutputStream out = new FileOutputStream(f2);
FileChannel inC = in.getChannel();
FileChannel outC = out.getChannel();
ByteBuffer b = null;
while (true) {
if (inC.position() == inC.size()) {
inC.close();
outC.close();
}
if ((inC.size() - inC.position()) < length) {
length = (int) (inC.size() - inC.position());
} else
length = 2097152;
b = ByteBuffer.allocateDirect(length);
inC.read(b);
b.flip();
outC.write(b);
outC.force(false);
}
}
/**
* 检查文件是否存在
*
* @param fileName
* @return
* @throws IOException
*/
public static boolean existFile(String fileName)
throws IOException {
File file = new File(fileName);
if (!file.exists()) {
throw new IOException("文件未找到:" + fileName);
}
return file.exists();
}
/**
* 删除文件
*
* @param fileName
*/
public static void deleteFile(String fileName)
throws IOException {
File file = new File(fileName);
if (!file.exists()) {
throw new IOException("文件未找到:" + fileName);
}
file.delete();
}
/**
* 读取文件到字符串
*
* @param fileName
* @return
* @throws IOException
*/
public static String readFile(String fileName)
throws IOException {
File file = new File(fileName);
if (!file.exists()) {
throw new IOException("文件未找到:" + fileName);
}
BufferedReader in = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String str = "";
while ((str = in.readLine()) != null) {
sb.append(str);
}
in.close();
return sb.toString();
}
/**
* 获取目录所有所有文件和文件夹
*
* @param fileName
* @return
* @throws IOException
*/
public static List<File> listFiles(String fileName)
throws IOException {
File file = new File(fileName);
if (!file.exists()) {
throw new IOException("文件未找到:" + fileName);
}
return Arrays.asList(file.listFiles());
}
/**
* 创建目录
*
* @param dir
*/
public static void mkdir(String dir) {
String dirTemp = dir;
File dirPath = new File(dirTemp);
if (!dirPath.exists()) {
dirPath.mkdir();
}
}
/**
* 新建文件
*
* @param fileName
* String 包含路径的文件名 如:E:\phsftp\src\123.txt
* @param content
* String 文件内容
*/
public static void createNewFile(String fileName, String content)
throws IOException {
String fileNameTemp = fileName;
File filePath = new File(fileNameTemp);
if (!filePath.exists()) {
filePath.createNewFile();
}
FileWriter fw = new FileWriter(filePath);
PrintWriter pw = new PrintWriter(fw);
String strContent = content;
pw.println(strContent);
pw.flush();
pw.close();
fw.close();
}
/**
* 删除文件夹
*
* @param folderPath
* 文件夹路径
*/
public static void delFolder(String folderPath) {
// 删除文件夹里面所有内容
delAllFile(folderPath);
String filePath = folderPath;
java.io.File myFilePath = new java.io.File(filePath);
// 删除空文件夹
myFilePath.delete();
}
/**
* 删除文件夹里面的所有文件
*
* @param path
* 文件夹路径
*/
public static void delAllFile(String path) {
File file = new File(path);
if (!file.exists()) {
return;
}
if (!file.isDirectory()) {
return;
}
String[] childFiles = file.list();
File temp = null;
for (int i = 0; i < childFiles.length; i++) {
// File.separator与系统有关的默认名称分隔符
// 在UNIX系统上,此字段的值为'/';在Microsoft Windows系统上,它为 '\'。
if (path.endsWith(File.separator)) {
temp = new File(path + childFiles[i]);
} else {
temp = new File(path + File.separator + childFiles[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path + File.separatorChar + childFiles[i]);// 先删除文件夹里面的文件
delFolder(path + File.separatorChar + childFiles[i]);// 再删除空文件夹
}
}
}
/**
* 复制单个文件,传统方式
*
* @param srcFile
* 包含路径的源文件 如:E:/phsftp/src/abc.txt
* @param dirDest
* 目标文件目录;若文件目录不存在则自动创建 如:E:/phsftp/dest
* @throws IOException
*/
public static void copyFile(String srcFile, String dirDest)
throws IOException {
FileInputStream in = new FileInputStream(srcFile);
mkdir(dirDest);
FileOutputStream out = new FileOutputStream(dirDest + "/" + new File(srcFile).getName());
int len;
byte buffer[] = new byte[1024];
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
out.close();
in.close();
}
/**
* 复制文件夹
*
* @param oldPath
* String 源文件夹路径 如:E:/phsftp/src
* @param newPath
* String 目标文件夹路径 如:E:/phsftp/dest
* @return boolean
*/
public static void copyFolder(String oldPath, String newPath)
throws IOException {
// 如果文件夹不存在 则新建文件夹
mkdir(newPath);
File file = new File(oldPath);
String[] files = file.list();
File temp = null;
for (int i = 0; i < files.length; i++) {
if (oldPath.endsWith(File.separator)) {
temp = new File(oldPath + files[i]);
} else {
temp = new File(oldPath + File.separator + files[i]);
}
if (temp.isFile()) {
FileInputStream input = new FileInputStream(temp);
FileOutputStream output = new FileOutputStream(newPath + "/"
+ (temp.getName()).toString());
byte[] buffer = new byte[1024 * 2];
int len;
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
output.flush();
output.close();
input.close();
}
if (temp.isDirectory()) {// 如果是子文件夹
copyFolder(oldPath + "/" + files[i], newPath + "/" + files[i]);
}
}
}
/**
* 移动文件到指定目录
*
* @param oldPath
* 包含路径的文件名 如:E:/phsftp/src/ljq.txt
* @param newPath
* 目标文件目录 如:E:/phsftp/dest
*/
public static void moveFile(String oldPath, String newPath)
throws IOException {
copyFile(oldPath, newPath);
deleteFile(oldPath);
}
/**
* 移动文件到指定目录,不会删除文件夹
*
* @param oldPath
* 源文件目录 如:E:/phsftp/src
* @param newPath
* 目标文件目录 如:E:/phsftp/dest
*/
public static void moveFiles(String oldPath, String newPath)
throws IOException {
copyFolder(oldPath, newPath);
delAllFile(oldPath);
}
/**
* 移动文件到指定目录,会删除文件夹
*
* @param oldPath
* 源文件目录 如:E:/phsftp/src
* @param newPath
* 目标文件目录 如:E:/phsftp/dest
*/
public static void moveFolder(String oldPath, String newPath)
throws IOException {
copyFolder(oldPath, newPath);
delFolder(oldPath);
}
/**
* 解压zip文件
* 说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.
* 问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时,
* 就会出现异常:"Exception in thread "main " java.lang.IllegalArgumentException
* at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
* @param srcDir
* 解压前存放的目录
* @param destDir
* 解压后存放的目录
* @throws Exception
*/
public static void unZip(String srcDir, String destDir)
throws IOException {
int leng = 0;
byte[] b = new byte[1024 * 2];
/** 获取zip格式的文件 **/
File[] zipFiles = new ExtensionFileFilter("zip").getFiles(srcDir);
if (zipFiles != null && !"".equals(zipFiles)) {
for (int i = 0; i < zipFiles.length; i++) {
File file = zipFiles[i];
/** 解压的输入流 * */
ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) {
File destFile = null;
if (destDir.endsWith(File.separator)) {
destFile = new File(destDir + entry.getName());
} else {
destFile = new File(destDir + File.separator + entry.getName());
}
/** 把解压包中的文件拷贝到目标目录 * */
FileOutputStream fos = new FileOutputStream(destFile);
while ((leng = zis.read(b)) != -1) {
fos.write(b, 0, leng);
}
fos.close();
}
zis.close();
}
}
}
/**
* 压缩文件
* 说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.
* 问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时,
* 就会出现异常:"Exception in thread "main " java.lang.IllegalArgumentException
* at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
* @param srcDir
* 压缩前存放的目录
* @param destDir
* 压缩后存放的目录
* @throws Exception
*/
public static void zip(String srcDir, String destDir)
throws IOException {
String tempFileName = null;
byte[] buf = new byte[1024 * 2];
int len;
// 获取要压缩的文件
File[] files = new File(srcDir).listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
if (destDir.endsWith(File.separator)) {
tempFileName = destDir + file.getName() + ".zip";
} else {
tempFileName = destDir + File.separator + file.getName() + ".zip";
}
FileOutputStream fos = new FileOutputStream(tempFileName);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ZipOutputStream zos = new ZipOutputStream(bos);// 压缩包
ZipEntry ze = new ZipEntry(file.getName());// 压缩包文件名
zos.putNextEntry(ze);// 写入新的ZIP文件条目并将流定位到条目数据的开始处
while ((len = bis.read(buf)) != -1) {
zos.write(buf, 0, len);
zos.flush();
}
bis.close();
zos.close();
}
}
}
}
/**
* 读取数据
*
* @param inSream
* @param charsetName
* @return
* @throws Exception
*/
public static String readData(InputStream inSream, String charsetName)
throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inSream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inSream.close();
return new String(data, charsetName);
}
/**
* 一行一行读取文件,适合字符读取,若读取中文字符时会出现乱码
*
* @param path
* @return
* @throws Exception
*/
public static Set<String> readFileLine(String path)
throws IOException {
Set<String> datas = new HashSet<String>();
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
String line = null;
while ((line = br.readLine()) != null) {
datas.add(line);
}
br.close();
fr.close();
return datas;
}
public static void main(String[] args) {
try {
unZip("c:/test", "c:/test");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ExtensionFileFilter
implements FileFilter {
private String extension;
public ExtensionFileFilter(String extension) {
this.extension = extension;
}
public File[] getFiles(String srcDir) throws IOException {
return (File[]) FileUtils.listFiles(srcDir).toArray();
}
public boolean accept(File file) {
if (file.isDirectory()) {
return false;
}
String name = file.getName();
// find the last
int idx = name.lastIndexOf(".");
if (idx == -1) {
return false;
} else if (idx == name.length() - 1) {
return false;
} else {
return this.extension.equals(name.substring(idx + 1));
}
}
}