一个文件工具类

来源:互联网 发布:贴吧 回复淘宝链接 编辑:程序博客网 时间:2024/06/18 04:50

最近陆陆续续的在做一些和文件相关的工作,今天无事就整理了一些近来整理的处理文件的工具类,有原创也有从网上拿来直接用的,拿来分享,以后继续完善。

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.math.BigInteger;import java.security.MessageDigest;import java.util.Date;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipFile;import org.apache.tools.zip.ZipOutputStream;/** * 操作文件工具类 *  * @author Administrator 2011-8-5 下午03:40:00 *  *  */public class FileUtil {static final int BUFFER = 1024;/** * 获取单个文件的MD5值 *  * @param file * @return */public static String getFileMD5(File file) {if (!file.isFile()) {return null;}MessageDigest digest = null;FileInputStream in = null;byte buffer[] = new byte[1024];int len;try {digest = MessageDigest.getInstance("MD5");in = new FileInputStream(file);while ((len = in.read(buffer, 0, 1024)) != -1) {digest.update(buffer, 0, len);}in.close();} catch (Exception e) {e.printStackTrace();return null;}BigInteger bigInt = new BigInteger(1, digest.digest());return bigInt.toString(16);}/** * 获取文件夹中文件的MD5值 *  * @param file * @param listChild *            ;true递归子目录中的文件 * @return */public static Map<String, String> getDirMD5(File file, boolean listChild) {if (!file.isDirectory()) {return null;}// <filepath,md5>Map<String, String> map = new HashMap<String, String>();String md5;File files[] = file.listFiles();for (int i = 0; i < files.length; i++) {File f = files[i];if (f.isDirectory() && listChild) {map.putAll(getDirMD5(f, listChild));} else {md5 = getFileMD5(f);if (md5 != null) {map.put(f.getPath(), md5);}}}return map;}/** * 给指定的文件重命名,加上指定的字符串 * @param file指定的文件 * @param str加上的字符串 * @return返回文件重名名后的文件名 */public static String reNameAddStr(File file, String str) {String fileName = file.getName();// 获得去掉后缀名后的文件名String name = fileName.substring(0, fileName.lastIndexOf("."));// 获得文件的后缀名String extendName = fileName.substring(fileName.lastIndexOf("."),fileName.length());String destName = name + str + extendName;file.renameTo(new File(file.getParent() + "\\" + destName));return destName;}/** * 从指定文件的文件名中去掉指定字符串 * @param file指定文件 * @param str去掉的字符串 * @return返回文件的重命名后的文件名 */public static String reNameDelStr(File file, String str) {String fileName = file.getName();if(fileName == null || str == null || fileName.length() <= str.length()) {return "";}// 获得去掉后缀名后的文件名String name = fileName.substring(0, fileName.lastIndexOf("."));//获得去掉str后的文件名String realName = name.substring(0,name.length()-str.length());// 获得文件的后缀名String extendName = fileName.substring(fileName.lastIndexOf("."),fileName.length());String destName = realName + extendName;file.renameTo(new File(file.getParent() + "\\" + destName));return destName;}/** * 把文件重命名,文件名后加上1970年距今的毫秒数,防止文件重名 *  * @param fileName * @return */public static String reNameAddTime(String fileName) {// 获得去掉后缀名后的文件名String name = fileName.substring(0, fileName.lastIndexOf("."));// 获得文件的后缀名String extendName = fileName.substring(fileName.lastIndexOf("."),fileName.length());return name + new Date().getTime() + extendName;}/** * 把文件重命名,文件名为1970年距今的毫秒数,防止文件重名 *  * @param fileName * @return */public static String reNameToTime(String fileName) {// 获得文件的后缀名String extendName = fileName.substring(fileName.lastIndexOf("."),fileName.length());return new Date().getTime() + extendName;}/** * 把文件名进行还原,去掉后面的时间,时间百年内仍是13位 *  * @param fileName * @return */public static String reNameDelTime(String fileName) {// 获得去掉后缀名后的文件名String name = fileName.substring(0, fileName.lastIndexOf("."));// 获得文件的后缀名String extendName = fileName.substring(fileName.lastIndexOf("."),fileName.length());return name.substring(0, name.length() - 13) + extendName;}/** * 用zip格式压缩文件 *  * @param zipFile *            压缩后的文件名 包含路径 如:"c:\\test.zip" * @param inputFile *            要压缩的文件 可以是文件或文件夹 如:"c:\\test" 或 "c:\\test.doc" * @throws Exception *  *             ant下的zip工具默认压缩编码为UTF-8编码,而winRAR软件压缩是用的windows默认的GBK或者GB2312编码 *  *             用ant压缩后放到windows上面会出现中文文件名乱码,用winRAR压缩的文件,用ant解压也会出现乱码, *  *             所以,在用ant处理winRAR压缩的文件时,要设置压缩编码 */public static void zip(File zipFile, String inputFile) throws Exception {File f = new File(inputFile);// File temp = new File(zipFileName);ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile));// 设置压缩编码out.setEncoding("GBK");// 设置为GBK后在windows下就不会乱码了,如果要放到Linux或者Unix下就不要设置了zip(out, f, "");// 递归压缩方法System.out.println("zip done");out.close();}private static void zip(ZipOutputStream out, File f, String base)throws Exception {System.out.println("Zipping   " + f.getName()); // 记录日志,开始压缩if (f.isDirectory()) { // 如果是文件夹,则获取下面的所有文件File[] fl = f.listFiles();out.putNextEntry(new ZipEntry(base + "/"));// 此处要将文件写到文件夹中只用在文件名前加"/"再加文件夹名base = base.length() == 0 ? "" : base + "/";for (int i = 0; i < fl.length; i++) {zip(out, fl[i], base + fl[i].getName());}} else { // 如果是文件,则压缩out.putNextEntry(new ZipEntry(base)); // 生成下一个压缩节点FileInputStream in = new FileInputStream(f); // 读取文件内容int len;byte[] buf = new byte[BUFFER];while ((len = in.read(buf, 0, BUFFER)) != -1) {out.write(buf, 0, len); // 写入到压缩包}in.close();}}/** * 解压缩zip文件 *  * @param fileName *            要解压的文件名 包含路径 如:"c:\\test.zip" * @param filePath *            解压后存放文件的路径 如:"c:\\temp" * @throws Exception */public static void unZip(String fileName, String filePath) throws Exception {ZipFile zipFile = new ZipFile(fileName, "GBK"); // 以“GBK”编码创建zip文件,用来处理winRAR压缩的文件。Enumeration emu = zipFile.getEntries();while (emu.hasMoreElements()) {ZipEntry entry = (ZipEntry) emu.nextElement();if (entry.isDirectory()) {new File(filePath + entry.getName()).mkdirs();continue;}BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));File file = new File(filePath + entry.getName());File parent = file.getParentFile();if (parent != null && (!parent.exists())) {parent.mkdirs();}FileOutputStream fos = new FileOutputStream(file);BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);byte[] buf = new byte[BUFFER];int len = 0;while ((len = bis.read(buf, 0, BUFFER)) != -1) {fos.write(buf, 0, len);}bos.flush();bos.close();bis.close();System.out.println("解压文件:" + file.getName());}zipFile.close();}public static void main(String[] args) throws Exception {//unZip("D:\\test\\新建文件夹.zip", "D:\\test\\");// zip(new File("D:\\test\\新建文件夹.zip"), "D:\\test\\新建文件夹");System.out.println(getFileMD5(new File("D:\\test\\新建文件夹.zip")));System.out.println(getFileMD5(new File("D:\\test\\1.zip")));File file = new File("D:\\test\\test2cf4bb1ab1c4c64c4a504306f9b08556.zip");System.out.println(reNameDelStr(file, getFileMD5(file)));}}


原创粉丝点击