/*
* @(#)MyUtils.java 2008-12-14
*
* Copyright YOURGAME. All rights reserved.
*/
package com.lhq.prj.dd.core;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
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.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Random;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import de.innosystec.unrar.Archive;
import de.innosystec.unrar.exception.RarException;
import de.innosystec.unrar.rarfile.FileHeader;
public class MyUtils {
/**
* 删除文件
*
* @param filePathAndName
* String 文件路径及名称 如c:/fqf.txt
* @param fileContent
* String
* @return boolean
*/
public static boolean delFile(String filePathAndName) {
File myDelFile = new java.io.File(filePathAndName);
if (!myDelFile.exists()) {
return true;
}
return myDelFile.delete();
}
/**
* 删除指定文件路径下面的所有文件和文件夹
*
* @param file
*/
public static boolean delFiles(File file) {
boolean flag = false;
try {
if (file.exists()) {
if (file.isDirectory()) {
String[] contents = file.list();
for (int i = 0; i < contents.length; i++) {
File file2X = new File(file.getAbsolutePath() + "/" + contents[i]);
if (file2X.exists()) {
if (file2X.isFile()) {
flag = file2X.delete();
} else if (file2X.isDirectory()) {
delFiles(file2X);
}
} else {
throw new RuntimeException("File not exist!");
}
}
}
flag = file.delete();
} else {
throw new RuntimeException("File not exist!");
}
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
/**
* 判断文件名是否已经存在,如果存在则在后面家(n)的形式返回新的文件名,否则返回原始文件名 例如:已经存在文件名 log4j.htm
* 则返回log4j(1).htm
*
* @param fileName
* 文件名
* @param dir
* 判断的文件路径
* @return 判断后的文件名
*/
public static String checkFileName(String fileName, String dir) {
boolean isDirectory = new File(dir + fileName).isDirectory();
if (MyUtils.isFileExist(fileName, dir)) {
int index = fileName.lastIndexOf(".");
StringBuffer newFileName = new StringBuffer();
String name = isDirectory ? fileName : fileName.substring(0, index);
String extendName = isDirectory ? "" : fileName.substring(index);
int nameNum = 1;
while (true) {
newFileName.append(name).append("(").append(nameNum).append(")");
if (!isDirectory) {
newFileName.append(extendName);
}
if (MyUtils.isFileExist(newFileName.toString(), dir)) {
nameNum++;
newFileName = new StringBuffer();
continue;
}
return newFileName.toString();
}
}
return fileName;
}
/**
* 返回上传的结果,成功与否
*
* @param uploadFileName
* @param savePath
* @param uploadFile
* @return
*/
public static boolean upload(String uploadFileName, String savePath, File uploadFile) {
boolean flag = false;
try {
uploadForName(uploadFileName, savePath, uploadFile);
flag = true;
} catch (IOException e) {
flag = false;
e.printStackTrace();
}
return flag;
}
/**
* 上传文件并返回上传后的文件名
*
* @param uploadFileName
* 被上传的文件名称
* @param savePath
* 文件的保存路径
* @param uploadFile
* 被上传的文件
* @return 成功与否
* @throws IOException
*/
public static String uploadForName(String uploadFileName, String savePath, File uploadFile) throws IOException {
String newFileName = checkFileName(uploadFileName, savePath);
FileOutputStream fos = null;
FileInputStream fis = null;
try {
fos = new FileOutputStream(savePath + newFileName);
fis = new FileInputStream(uploadFile);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
} finally {
try {
if (fos != null) {
fos.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
throw e;
}
}
return newFileName;
}
/**
* 根据路径创建一系列的目录
*
* @param path
*/
public static boolean mkDirectory(String path) {
File file = null;
try {
file = new File(path);
if (!file.exists()) {
return file.mkdirs();
}
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
file = null;
}
return false;
}
/**
* 将对象数组的每一个元素分别添加到指定集合中,调用Apache commons collections 中的方法
*
* @param collection
* 目标集合对象
* @param arr
* 对象数组
*/
public static void addToCollection(Collection collection, Object[] arr) {
if (null != collection && null != arr) {
CollectionUtils.addAll(collection, arr);
}
}
/**
* 将字符串已多个分隔符拆分为数组,调用Apache commons lang 中的方法
*
* <pre>
* Example:
* String[] arr = StringUtils.split("a b,c d,e-f", " ,");
* System.out.println(arr.length);//输出6
* </pre>
*
* @param str
* 目标字符串
* @param separatorChars
* 分隔符字符串
* @return 字符串数组
*/
public static String[] split(String str, String separatorChars) {
return StringUtils.split(str, separatorChars);
}
/**
* 调用指定字段的setter方法
*
* <pre>
* Example:
* User user = new User();
* MyUtils.invokeSetMethod("userName", user, new Object[] {"张三"});
* </pre>
*
* @param fieldName
* 字段(属性)名称
* @param invokeObj
* 被调用方法的对象
* @param args
* 被调用方法的参数数组
* @return 成功与否
*/
public static boolean invokeSetMethod(String fieldName, Object invokeObj, Object[] args) {
boolean flag = false;
Field[] fields = invokeObj.getClass().getDeclaredFields(); // 获得对象实体类中所有定义的字段
Method[] methods = invokeObj.getClass().getDeclaredMethods(); // 获得对象实体类中所有定义的方法
for (Field f : fields) {
String fname = f.getName();
if (fname.equals(fieldName)) {// 找到要更新的字段名
String mname = "set" + (fname.substring(0, 1).toUpperCase() + fname.substring(1));// 组建setter方法
for (Method m : methods) {
String name = m.getName();
if (mname.equals(name)) {
// 处理Integer参数
if (f.getType().getSimpleName().equalsIgnoreCase("integer") && args.length > 0) {
args[0] = Integer.valueOf(args[0].toString());
}
// 处理Boolean参数
if (f.getType().getSimpleName().equalsIgnoreCase("boolean") && args.length > 0) {
args[0] = Boolean.valueOf(args[0].toString());
}
try {
m.invoke(invokeObj, args);
flag = true;
} catch (IllegalArgumentException e) {
flag = false;
e.printStackTrace();
} catch (IllegalAccessException e) {
flag = false;
e.printStackTrace();
} catch (InvocationTargetException e) {
flag = false;
e.printStackTrace();
}
}
}
}
}
return flag;
}
/**
* 判断文件是否存在
*
* @param fileName
* @param dir
* @return
*/
public static boolean isFileExist(String fileName, String dir) {
File files = new File(dir + fileName);
return (files.exists()) ? true : false;
}
/**
* 获得随机文件名,保证在同一个文件夹下不同名
*
* @param fileName
* @param dir
* @return
*/
public static String getRandomName(String fileName, String dir) {
String[] split = fileName.split("\\.");// 将文件名已.的形式拆分
String extendFile = "." + split[split.length - 1].toLowerCase(); // 获文件的有效后缀
Random random = new Random();
int add = random.nextInt(1000000); // 产生随机数10000以内
String ret = add + extendFile;
while (isFileExist(ret, dir)) {
add = random.nextInt(1000000);
ret = fileName + add + extendFile;
}
return ret;
}
/**
* 创建缩略图
*
* @param file
* 上传的文件流
* @param height
* 最小的尺寸
* @throws IOException
*/
public static void createMiniPic(File file, float width, float height) throws IOException {
Image src = javax.imageio.ImageIO.read(file); // 构造Image对象
int old_w = src.getWidth(null); // 得到源图宽
int old_h = src.getHeight(null);
int new_w = 0;
int new_h = 0; // 得到源图长
float tempdouble;
if (old_w >= old_h) {
tempdouble = old_w / width;
} else {
tempdouble = old_h / height;
}
if (old_w >= width || old_h >= height) { // 如果文件小于锁略图的尺寸则复制即可
new_w = Math.round(old_w / tempdouble);
new_h = Math.round(old_h / tempdouble);// 计算新图长宽
while (new_w > width && new_h > height) {
if (new_w > width) {
tempdouble = new_w / width;
new_w = Math.round(new_w / tempdouble);
new_h = Math.round(new_h / tempdouble);
}
if (new_h > height) {
tempdouble = new_h / height;
new_w = Math.round(new_w / tempdouble);
new_h = Math.round(new_h / tempdouble);
}
}
BufferedImage tag = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null); // 绘制缩小后的图
FileOutputStream newimage = new FileOutputStream(file); // 输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(tag);
param.setQuality((float) (100 / 100.0), true);// 设置图片质量,100最大,默认70
encoder.encode(tag, param);
encoder.encode(tag); // 将JPEG编码
newimage.close();
}
}
/**
* 判断文件类型是否是合法的,就是判断allowTypes中是否包含contentType
*
* @param contentType
* 文件类型
* @param allowTypes
* 文件类型列表
* @return 是否合法
*/
public static boolean isValid(String contentType, String[] allowTypes) {
if (null == contentType || "".equals(contentType)) {
return false;
}
for (String type : allowTypes) {
if (contentType.equals(type)) {
return true;
}
}
return false;
}
/**
* 多文件压缩
*
* <pre>
* Example :
* ZipOutputStream zosm = new ZipOutputStream(new FileOutputStream("c:/b.zip"));
* zipFiles(zosm, new File("c:/com"), "");
* zosm.close();
* </pre>
*
* @param zosm
* @param file
* @param basePath
* @throws IOException
*/
public static void compressionFiles(ZipOutputStream zosm, File file, String basePath) {
if (file.isDirectory()) {
File[] files = file.listFiles();
try {
zosm.putNextEntry(new ZipEntry(basePath + "/"));
} catch (IOException e) {
e.printStackTrace();
}
basePath = basePath + (basePath.length() == 0 ? "" : "/") + file.getName();
for (File f : files) {
compressionFiles(zosm, f, basePath);
}
} else {
FileInputStream fism = null;
BufferedInputStream bism = null;
try {
byte[] bytes = new byte[1024];
fism = new FileInputStream(file);
bism = new BufferedInputStream(fism, 1024);
basePath = basePath + (basePath.length() == 0 ? "" : "/") + file.getName();
zosm.putNextEntry(new ZipEntry(basePath));
int count;
while ((count = bism.read(bytes, 0, 1024)) != -1) {
zosm.write(bytes, 0, count);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bism != null) {
try {
bism.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fism != null) {
try {
fism.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 解压缩zip文件
*
* @param zipFileName
* 压缩文件
* @param extPlace
* 解压的路径
*/
public static boolean decompressionZipFiles(String zipFileName, String extPlace) {
boolean flag = false;
try {
unZip(zipFileName,extPlace);
flag = true;
} catch (RuntimeException e) {
e.printStackTrace();
}
return flag;
// java.util.zip.ZipInputStream in = null;
// java.util.zip.ZipEntry entry = null;
// FileOutputStream os = null;
// try {
// in = new java.util.zip.ZipInputStream(new FileInputStream(zipFileName));
// while ((entry = in.getNextEntry()) != null) {
// String entryName = entry.getName();
// int end = entryName.lastIndexOf("/");
// String name = "";
// if (end != -1) {
// name = entryName.substring(0, end);
// }
// File file = new File(extPlace + name);
// if (!file.exists()) {
// file.mkdirs();
// }
// if (entry.isDirectory()) {
// in.closeEntry();
// continue;
// } else {
// os = new FileOutputStream(extPlace + entryName);
// byte[] buf = new byte[1024];
// int len;
// while ((len = in.read(buf)) > 0) {
// os.write(buf, 0, len);
// }
// in.closeEntry();
// }
// }
// flag = true;
// } catch (FileNotFoundException e1) {
// flag = false;
// e1.printStackTrace();
// } catch (IOException e1) {
// flag = false;
// e1.printStackTrace();
// } finally {
// if (in != null) {
// try {
// in.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// if (os != null) {
// try {
// os.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
}
/**
* 解压缩rar文件
*
* @param rarFileName
* @param extPlace
*/
public static boolean decompressionRarFiles(String rarFileName, String extPlace) {
boolean flag = false;
Archive archive = null;
File out = null;
File file = null;
File dir = null;
FileOutputStream os = null;
FileHeader fh = null;
String path, dirPath = "";
try {
file = new File(rarFileName);
archive = new Archive(file);
} catch (RarException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
if (file != null) {
file = null;
}
}
if (archive != null) {
try {
fh = archive.nextFileHeader();
while (fh != null) {
path = (extPlace + fh.getFileNameString().trim()).replaceAll("\\\\", "/");
int end = path.lastIndexOf("/");
if (end != -1) {
dirPath = path.substring(0, end);
}
try {
dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdirs();
}
} catch (RuntimeException e1) {
e1.printStackTrace();
} finally {
if (dir != null) {
dir = null;
}
}
if (fh.isDirectory()) {
fh = archive.nextFileHeader();
continue;
}
out = new File(extPlace + fh.getFileNameString().trim());
try {
os = new FileOutputStream(out);
archive.extractFile(fh, os);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (RarException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
out = null;
}
}
fh = archive.nextFileHeader();
}
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
fh = null;
if (archive != null) {
try {
archive.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
flag = true;
}
return flag;
}
private static void getDir(String directory, String subDirectory){
String dir[];
File fileDir = new File(directory);
try {
if (subDirectory == "" && fileDir.exists() != true)
fileDir.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 zipFileNaame being unzip file including file name and path ;
* @param outputDirectory unzip files to this directory
*
*/
public static void unZip(String zipFileName, String outputDirectory){
try {
ZipFile zipFile = new ZipFile(zipFileName);
java.util.Enumeration e = zipFile.getEntries();
ZipEntry zipEntry = null;
getDir(outputDirectory, "");
while (e.hasMoreElements()) {
zipEntry = (ZipEntry) e.nextElement();
//System.out.println("unziping " + 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();
//System.out.println("创建目录:" + outputDirectory + File.separator + name);
}
else {
String fileName = zipEntry.getName();
fileName = fileName.replace('\\', '/');
// System.out.println("测试文件1:" +fileName);
if (fileName.indexOf("/") != -1){
getDir(outputDirectory,
fileName.substring(0, fileName.lastIndexOf("/")));
//System.out.println("文件的路径:"+fileName);
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);
}
out.close();
in.close();
}
}
}catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
/**
* this mothed will unzip all the files which in your specifeid folder;
* @param filesFolder
* @param outputDirectory
*/
public static void unzipFiles(String filesFolder ,String outputDirectory){
File zipFolder=new File (filesFolder);
String zipFiles [];
String zipFileAbs;
try{
zipFiles=zipFolder.list();
for(int i=0;i<zipFiles.length;i++){
if(zipFiles[i].length()==(zipFiles[i].lastIndexOf(".zip")+4)){//判断是不是zip包
zipFileAbs=filesFolder+File.separator+zipFiles[i];
unZip(zipFileAbs,outputDirectory);
}
}
}catch (SecurityException ex){
ex.printStackTrace();
}
}
public static void main(String[] ar) throws RarException, IOException {
String s = null;
s.length();
unzipFiles("K:\\song","K:\\song\\song");
}
}