一个java文件操作工具类

最近在写一些文件操作的方法,就把这些方法放一起,方便以后自己使用,写得不好,希望各位高手多多指教。


package com.myclover.utils.file;

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 java.util.zip.ZipOutputStream;

/**
 * <pre>
 * 功能描述:文件操作工具类
 *           实现文件的创建、删除、复制、压缩、解压以及目录的创建、删除、复制、压缩解压等功能
 * </pre>
 * @author 方方        <p>
 * 		   Blog:  http://myclover.iteye.com <p>
 * 		       日   期:  2010-07-26 <p>
 * @version 0.1   <p>
 * {@code com.myclover.utils.file.FileOperateUtils.java}
 * 
 */
public class FileOperateUtils {
	
	/**
	 * 
	 * 功能描述:复制单个文件,如果目标文件存在,则不覆盖
	 * @param srcFileName   待复制的文件名
	 * @param descFileName  目标文件名
	 * @return              返回:
	 * 							如果复制成功,则返回true,否则返回false
	 */
	public static boolean copyFile(String srcFileName , String descFileName)
	{
		return FileOperateUtils.copyFileCover(srcFileName, descFileName, false);
	}
	
	
	/**
	 * 
	 * 功能描述:复制单个文件
	 * @param srcFileName    待复制的文件名
	 * @param descFileName   目标文件名
	 * @param coverlay        如果目标文件已存在,是否覆盖
	 * @return               返回:
	 * 							 如果复制成功,则返回true,否则返回false
	 */
	public static boolean copyFileCover(String srcFileName , String descFileName , boolean coverlay)
	{
		File srcFile = new File(srcFileName);
		//判断源文件是否存在
		if(!srcFile.exists())
		{
			System.out.println("复制文件失败,源文件" + srcFileName + "不存在!");
			return false;
		}
		//判断源文件是否是合法的文件
		else if(!srcFile.isFile())
		{
			System.out.println("复制文件失败," + srcFileName + "不是一个文件!");
			return false;
		}
		File descFile = new File(descFileName);
		//判断目标文件是否存在
		if(descFile.exists())
		{
			//如果目标文件存在,并且允许覆盖
			if(coverlay)
			{
				System.out.println("目标文件已存在,准备删除!");
				if(!FileOperateUtils.delFile(descFileName))
				{
					System.out.println("删除目标文件" + descFileName + "失败!");
					return false;
				}
			}
			else
			{
				System.out.println("复制文件失败,目标文件" + descFileName + "已存在!");
				return false;
			}
		}
		else
		{
			if(!descFile.getParentFile().exists())
			{
				//如果目标文件所在的目录不存在,则创建目录
				System.out.println("目标文件所在的目录不存在,创建目录!");
				//创建目标文件所在的目录
				if(!descFile.getParentFile().mkdirs())
				{
					System.out.println("创建目标文件所在的目录失败!");
					return false;
				}
			}
		}
		
		//准备复制文件
		//读取的位数
		int readByte = 0;
		InputStream ins = null;
		OutputStream outs = null;
		try
		{
			//打开源文件
			ins = new FileInputStream(srcFile);
			//打开目标文件的输出流
			outs = new FileOutputStream(descFile);
			byte[] buf = new byte[1024];
			//一次读取1024个字节,当readByte为-1时表示文件已经读取完毕
			while((readByte = ins.read(buf)) != -1)
			{
				//将读取的字节流写入到输出流
				outs.write(buf, 0, readByte);
			}
			System.out.println("复制单个文件" + srcFileName + "到" + descFileName + "成功!");
			return true;
		}
		catch(Exception e)
		{
			System.out.println("复制文件失败:" + e.getMessage());
			return false;
		}
		finally
		{
			//关闭输入输出流,首先关闭输出流,然后再关闭输入流
			if(outs != null)
			{
				try
				{
					outs.close();
				}
				catch(IOException oute)
				{
					oute.printStackTrace();
				}
			}
			if(ins != null)
			{
				try
				{
					ins.close();
				}
				catch(IOException ine)
				{
					ine.printStackTrace();
				}
			}
		}
	}
	
	
	/**
	 * 
	 * 功能描述:复制整个目录的内容,如果目标目录存在,则不覆盖
	 * @param srcDirName   源目录名
	 * @param descDirName  目标目录名
	 * @return             返回:
	 * 							如果复制成功返回true,否则返回false
	 */ 
	public static boolean copyDirectory(String srcDirName , String descDirName)
	{
		return FileOperateUtils.copyDirectoryCover(srcDirName, descDirName, false);
	}
	
	
	/**
	 * 
	 * 功能描述:复制整个目录的内容
	 * @param srcDirName   源目录名
	 * @param descDirName  目标目录名
	 * @param coverlay      如果目标目录存在,是否覆盖   
	 * @return             返回:
	 * 							如果复制成功返回true,否则返回false
	 */
	public static boolean copyDirectoryCover(String srcDirName , String descDirName , boolean coverlay)
	{
		File srcDir = new File(srcDirName);
		//判断源目录是否存在
		if(!srcDir.exists())
		{
			System.out.println("复制目录失败,源目录" + srcDirName + "不存在!");
			return false;
		}
		//判断源目录是否是目录
		else if(!srcDir.isDirectory())
		{
			System.out.println("复制目录失败," + srcDirName + "不是一个目录!");
			return false;
		}
		//如果目标文件夹名不以文件分隔符结尾,自动添加文件分隔符
		if(!descDirName.endsWith(File.separator))
		{
			descDirName = descDirName + File.separator;
		}
		File descDir = new File(descDirName);
		//如果目标文件夹存在
		if(descDir.exists())
		{
			if(coverlay)
			{
				//允许覆盖目标目录
				System.out.println("目标目录已存在,准备删除!");
				if(!FileOperateUtils.delFile(descDirName))
				{
					System.out.println("删除目录" + descDirName + "失败!");
					return false;
				}
			}
			else
			{
				System.out.println("目标目录复制失败,目标目录" + descDirName + "已存在!");
				return false;
			}
		}
		else
		{
			//创建目标目录
			System.out.println("目标目录不存在,准备创建!");
			if(!descDir.mkdirs())
			{
				System.out.println("创建目标目录失败!");
				return false;
			}
				
		}
		
		boolean flag = true;
		//列出源目录下的所有文件名和子目录名
		File[] files = srcDir.listFiles();
		for(int i = 0 ; i < files.length ; i++)
		{
			//如果是一个单个文件,则直接复制
			if(files[i].isFile())
			{
				flag = FileOperateUtils.copyFile(files[i].getAbsolutePath(), descDirName + files[i].getName());
				//如果拷贝文件失败,则退出循环
				if(!flag)
				{
					break;
				}
			}
			//如果是子目录,则继续复制目录
			if(files[i].isDirectory())
			{
				flag = FileOperateUtils.copyDirectory(files[i].getAbsolutePath(), descDirName + files[i].getName());
				//如果拷贝目录失败,则退出循环
				if(!flag)
				{
					break;
				}
			}
		}
		
		if(!flag)
		{
			System.out.println("复制目录" + srcDirName + "到" + descDirName + "失败!");
			return false;
		}
		System.out.println("复制目录" + srcDirName + "到" + descDirName + "成功!");
		return true;
		
	}
	
	
	/**
	 * 
	 * 功能描述:删除文件,可以删除单个文件或文件夹
	 * @param fileName   被删除的文件名
	 * @return			   返回:
	 * 						   如果删除成功,则返回true,否是返回false
	 */
	public static boolean delFile(String fileName)
	{
		File file = new File(fileName);
		if(!file.exists())
		{
			System.out.println("删除文件失败," + fileName + "文件不存在!");
			return false;
		}
		else
		{
			if(file.isFile())
			{
				return FileOperateUtils.deleteFile(fileName);
			}
			else
			{
				return FileOperateUtils.deleteDirectory(fileName);
			}
		}
	}
	
	
	/**
	 * 
	 * 功能描述:删除单个文件
	 * @param fileName  被删除的文件名
	 * @return          返回:
	 * 						如果删除成功,则返回true,否则返回false
	 */
	public static boolean deleteFile(String fileName)
	{
		File file = new File(fileName);
		if(file.exists() && file.isFile())
		{
			if(file.delete())
			{
				System.out.println("删除单个文件" + fileName + "成功!");
				return true;
			}
			else
			{
				System.out.println("删除单个文件" + fileName + "失败!");
				return false;
			}
		}
		else
		{
			System.out.println("删除单个文件失败," + fileName + "文件不存在!");
			return false;
		}
	}
	
	
	/**
	 * 
	 * 功能描述:删除目录及目录下的文件
	 * @param dirName  被删除的目录所在的文件路径
	 * @return         返回:
	 * 						如果目录删除成功,则返回true,否则返回false
	 */
	public static boolean deleteDirectory(String dirName)
	{
		if(!dirName.endsWith(File.separator))
		{
			dirName = dirName + File.separator;
		}
		File dirFile = new File(dirName);
		if(!dirFile.exists() || !dirFile.isDirectory())
		{
			System.out.println("删除目录失败" + dirName + "目录不存在!");
			return false;
		}
		boolean flag = true;
		//列出全部文件及子目录
		File[] files = dirFile.listFiles();
		for(int i = 0 ; i < files.length ; i++)
		{
			//删除子文件
			if(files[i].isFile())
			{
				flag = FileOperateUtils.deleteFile(files[i].getAbsolutePath());
				//如果删除文件失败,则退出循环
				if(!flag)
				{
					break;
				}
			}
			//删除子目录
			else if(files[i].isDirectory())
			{
				flag = FileOperateUtils.deleteDirectory(files[i].getAbsolutePath());
				//如果删除子目录失败,则退出循环
				if(!flag)
				{
					break;
				}
			}
		}
		
		if(!flag)
		{
			System.out.println("删除目录失败!");
			return false;
		}
		//删除当前目录
		if(dirFile.delete())
		{
			System.out.println("删除目录" + dirName + "成功!");
			return true;
		}
		else
		{
			System.out.println("删除目录" + dirName + "失败!");
			return false;
		}
		
	}
	
	
	/**
	 * 
	 * 功能描述:创建单个文件
	 * @param descFileName  文件名,包含路径
	 * @return              返回:
	 * 							如果创建成功,则返回true,否则返回false
	 */
	public static boolean createFile(String descFileName)
	{
		File file = new File(descFileName);
		if(file.exists())
		{
			System.out.println("文件" + descFileName + "已存在!");
			return false;
		}
		if(descFileName.endsWith(File.separator))
		{
			System.out.println(descFileName + "为目录,不能创建目录!");
			return false;
		}
		if(!file.getParentFile().exists())
		{
			//如果文件所在的目录不存在,则创建目录
			if(!file.getParentFile().mkdirs())
			{
				System.out.println("创建文件所在的目录失败!");
				return false;
			}
		}
		
		//创建文件
		try
		{
			if(file.createNewFile())
			{
				System.out.println(descFileName + "文件创建成功!");
				return true;
			}
			else
			{
				System.out.println(descFileName + "文件创建失败!");
				return false;
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
			System.out.println(descFileName + "文件创建失败!");
			return false;
		}
		
	}
	
	
	/**
	 * 
	 * 功能描述:创建目录
	 * @param descDirName  目录名,包含路径
	 * @return             返回:
	 * 							如果创建成功,则返回true,否则返回false
	 */
	public static boolean createDirectory(String descDirName)
	{
		if(!descDirName.endsWith(File.separator))
		{
			descDirName = descDirName + File.separator;
		}
		File descDir = new File(descDirName);
		if(descDir.exists())
		{
			System.out.println("目录" + descDirName + "已存在!");
			return false;
		}
		//创建目录
		if(descDir.mkdirs())
		{
			System.out.println("目录" + descDirName + "创建成功!");
			return true;
		}
		else
		{
			System.out.println("目录" + descDirName + "创建失败!");
			return false;
		}
		
	}
	
	
	/**
	 * 
	 * 功能描述:压缩文件或目录
	 * @param srcDirName     压缩的根目录
	 * @param fileName       根目录下的待压缩的文件名或文件夹名,其中*或""表示跟目录下的全部文件
	 * @param descFileName   目标zip文件
	 */
	public static void zipFiles(String srcDirName , String fileName , String descFileName)
	{
		//判断目录是否存在
		if(srcDirName == null)
		{
			System.out.println("文件压缩失败,目录" + srcDirName + "不存在!");
			return ;
		}
		File fileDir = new File(srcDirName);
		if(!fileDir.exists() || !fileDir.isDirectory())
		{
			System.out.println("文件压缩失败,目录" + srcDirName + "不存在!");
			return ;
		}
		String dirPath = fileDir.getAbsolutePath();
		File descFile = new File(descFileName);
		try
		{
			ZipOutputStream zouts = new ZipOutputStream(new FileOutputStream(descFile));
			if("*".equals(fileName) || "".equals(fileName))
			{
				FileOperateUtils.zipDirectoryToZipFile(dirPath, fileDir, zouts);
			}
			else
			{
				File file = new File(fileDir , fileName);
				if(file.isFile())
				{
					FileOperateUtils.zipFilesToZipFile(dirPath, file, zouts);
				}
				else
				{
					FileOperateUtils.zipDirectoryToZipFile(dirPath, file, zouts);
				}
			}
			zouts.close();
			System.out.println(descFileName + "文件压缩成功!");
		}
		catch(Exception e)
		{
			System.out.println("文件压缩失败:" + e.getMessage());
			e.printStackTrace();
		}
		
	}
	
	
	/**
	 * 功能描述:解压缩ZIP文件,将ZIP文件里的内容解压到descFileName目录下
	 * @param zipFileName   需要解压的ZIP文件
	 * @param descFileName  目标文件
	 */
	public static void unZipFiles(String zipFileName , String descFileName)
	{
		if(!descFileName.endsWith(File.separator))
		{
			descFileName = descFileName + File.separator;
		}
		try
		{
			//根据ZIP文件创建ZipFile对象
			ZipFile zipFile = new ZipFile(zipFileName);
			ZipEntry entry = null;
			String entryName = null;
			String descFileDir = null;
			byte[] buf = new byte[4096];
			int readByte = 0;
			//获取ZIP文件里所有的entry
			Enumeration enums = zipFile.entries();
			 //遍历所有entry
			while(enums.hasMoreElements())
			{
				entry = (ZipEntry)enums.nextElement();
				//获得entry的名字
				entryName = entry.getName();
				descFileDir = descFileName + entryName;
				if(entry.isDirectory())
				{
					//如果entry是一个目录,则创建目录
					new File(descFileDir).mkdirs();
					continue;
				}
				else
				{
					//如果entry是一个文件,则创建父目录
					new File(descFileDir).getParentFile().mkdirs();
				}
				File file = new File(descFileDir);
				//打开文件输出流
				FileOutputStream fouts = new FileOutputStream(file);
				//从ZipFile对象中打开entry的输入流
				InputStream ins = zipFile.getInputStream(entry);
				while((readByte = ins.read(buf)) != -1)
				{
					fouts.write(buf, 0, readByte);
				}
				fouts.close();
				ins.close();
			}
			System.out.println("文件解压成功!");
		}
		catch(Exception e)
		{
			System.out.println("文件解压失败:" + e.getMessage());
		}
		
	}
	
	
	/**
	 * 
	 * 功能描述:将目录压缩到ZIP输出流
	 * @param dirPath  目录路径
	 * @param fileDir  文件信息
	 * @param zouts    输出流
	 */
	public static void zipDirectoryToZipFile(String dirPath , File fileDir , ZipOutputStream zouts)
	{
		if(fileDir.isDirectory())
		{
			File[] files = fileDir.listFiles();
			//空的文件夹
			if(files.length == 0)
			{
				//目录信息
				ZipEntry entry = new ZipEntry(getEntryName(dirPath , fileDir));
				try
				{
					zouts.putNextEntry(entry);
					zouts.closeEntry();
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
				return ;
			}
			
			for(int i = 0 ; i < files.length ; i++)
			{
				if(files[i].isFile())
				{
					//如果是文件,则调用文件压缩方法
					FileOperateUtils.zipFilesToZipFile(dirPath, files[i], zouts);
				}
				else
				{
					//如果是目录,则递归调用
					FileOperateUtils.zipDirectoryToZipFile(dirPath, files[i], zouts);
				}
			}
				
		}
		
	}
	
	
	/**
	 * 
	 * 功能描述:将文件压缩到ZIP输出流
	 * @param dirPath  目录路径
	 * @param file     文件
	 * @param zouts    输出流
	 */
	public static void zipFilesToZipFile(String dirPath , File file , ZipOutputStream zouts)
	{
		FileInputStream fin = null;
		ZipEntry entry = null;
		//创建复制缓冲区
		byte[] buf = new byte[4096];
		int readByte = 0;
		if(file.isFile())
		{
			try
			{
				//创建一个文件输入流
				fin = new FileInputStream(file);
				//创建一个ZipEntry
				entry = new ZipEntry(getEntryName(dirPath , file));
				//存储信息到压缩文件
				zouts.putNextEntry(entry);
				//复制字节到压缩文件
				while((readByte = fin.read(buf)) != -1)
				{
					zouts.write(buf, 0, readByte);
				}
				zouts.closeEntry();
				fin.close();
				System.out.println("添加文件" + file.getAbsolutePath() + "到zip文件中!");
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		
	}
	
	
	/**
	 * 
	 * 功能描述:获取待压缩文件在ZIP文件中entry的名字,即相对于跟目录的相对路径名
	 * @param dirPath  目录名
	 * @param file     entry文件名
	 * @return
	 */
	private static String getEntryName(String dirPath , File file)
	{
		if(!dirPath.endsWith(File.separator))
		{
			dirPath = dirPath + File.separator;
		}
		String filePath = file.getAbsolutePath();
		// 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储
		if(file.isDirectory())
		{
			filePath += "/";
		}
		int index = filePath.indexOf(dirPath);
		
		return filePath.substring(index + dirPath.length());
	}
	
	
}

你可能感兴趣的:(java,Blog)