package com.moon.server.helper;
|
|
import com.moon.server.entity.all.StaticData;
|
import com.moon.server.entity.data.MetaFileEntity;
|
import com.twmacinta.util.MD5;
|
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.LogFactory;
|
|
import java.io.*;
|
import java.nio.ByteBuffer;
|
import java.nio.channels.FileChannel;
|
import java.nio.charset.StandardCharsets;
|
import java.security.MessageDigest;
|
import java.text.DecimalFormat;
|
import java.util.List;
|
|
/**
|
* 文件帮助类
|
* @author WWW
|
*/
|
public class FileHelper {
|
private final static Log log = LogFactory.getLog(FileHelper.class);
|
|
/**
|
* 获取文件名
|
*
|
* @param file
|
* @return
|
*/
|
public static String getFileName(String file) {
|
int idx = file.lastIndexOf(File.separator);
|
if (idx > -1) {
|
return file.substring(idx + 1);
|
}
|
|
return "";
|
}
|
|
/**
|
* 获取文件扩展名
|
*/
|
public static String getExtension(File file) {
|
if (file == null) {
|
return null;
|
}
|
|
String fileName = file.getName().toLowerCase();
|
|
int idx = fileName.indexOf(StaticData.POINT);
|
if (idx == -1) {
|
return "";
|
}
|
|
return fileName.substring(idx);
|
}
|
|
/**
|
* 获取文件扩展名
|
*/
|
public static String getExtension(String fileName) {
|
if (StringHelper.isEmpty(fileName)) {
|
return "";
|
}
|
|
int idx = fileName.lastIndexOf(StaticData.POINT);
|
if (idx == -1) {
|
return "";
|
}
|
|
return fileName.substring(idx).toLowerCase();
|
}
|
|
/**
|
* 获取多用途互联网邮件扩展类型
|
*
|
* @param ext 文件扩展名
|
* @return
|
*/
|
public static String getMime(String ext) {
|
switch (ext) {
|
// 图片
|
case ".tif":
|
case ".tiff":
|
return "image/tiff";
|
case ".img":
|
return "application/x-img";
|
case ".gif":
|
return "image/gif";
|
case ".jpg":
|
case ".jpeg":
|
return "image/jpeg";
|
case ".png":
|
return "image/png";
|
// 音/视频
|
case ".mp3":
|
return "audio/mp3";
|
case ".mp4":
|
return "video/mpeg4";
|
case ".avi":
|
return "video/avi";
|
case ".mpg":
|
case ".mpeg":
|
return "video/mpg";
|
case ".wav":
|
return "audio/wav";
|
case ".wma":
|
return "audio/x-ms-wma";
|
case ".swf":
|
return "application/x-shockwave-flash";
|
case ".wmv":
|
return "video/x-ms-wmv";
|
case ".rm":
|
return "application/vnd.rn-realmedia";
|
case ".rmvb":
|
return "application/vnd.rn-realmedia-vbr";
|
// 网页
|
case ".js":
|
return "application/x-javascript";
|
case ".css":
|
return "text/css";
|
case ".asp":
|
return "text/asp";
|
case ".mht":
|
return "message/rfc822";
|
case ".jsp":
|
case ".htm":
|
case ".html":
|
case ".xhtml":
|
return "text/html";
|
case ".xml":
|
case ".svg":
|
return "text/xml";
|
// 文件
|
case ".txt":
|
return "text/plain";
|
case ".dbf":
|
return "application/x-dbf";
|
case ".mdb":
|
return "application/msaccess";
|
case ".pdf":
|
return "application/pdf";
|
case ".ppt":
|
case ".pptx":
|
return "application/x-ppt";
|
case ".doc":
|
case ".docx":
|
return "application/msword";
|
case ".xls":
|
case ".xlsx":
|
return "application/vnd.ms-excel";
|
case ".dgn":
|
return "application/x-dgn";
|
case ".dwg":
|
return "application/x-dwg";
|
case ".ext":
|
return "application/x-msdownload";
|
// 默认
|
default:
|
return "application/octet-stream";
|
}
|
}
|
|
/**
|
* 字节单位换算
|
*/
|
public static String formatByte(long byteNumber) {
|
double kbNumber = byteNumber / StaticData.D1024;
|
if (kbNumber < StaticData.D1024) {
|
return new DecimalFormat("#.##KB").format(kbNumber);
|
}
|
double mbNumber = kbNumber / StaticData.D1024;
|
if (mbNumber < StaticData.D1024) {
|
return new DecimalFormat("#.##MB").format(mbNumber);
|
}
|
double gbNumber = mbNumber / StaticData.D1024;
|
if (gbNumber < StaticData.D1024) {
|
return new DecimalFormat("#.##GB").format(gbNumber);
|
}
|
double tbNumber = gbNumber / StaticData.D1024;
|
|
return new DecimalFormat("#.##TB").format(tbNumber);
|
}
|
|
/**
|
* 获取文件大小
|
*/
|
public static String getSizes(double mbNumber) {
|
if (mbNumber < StaticData.D1024) {
|
return new DecimalFormat("#.##MB").format(mbNumber);
|
}
|
|
double gbNumber = mbNumber / StaticData.D1024;
|
if (gbNumber < StaticData.D1024) {
|
return new DecimalFormat("#.##GB").format(gbNumber);
|
}
|
|
double tbNumber = gbNumber / StaticData.D1024;
|
|
return new DecimalFormat("#.##TB").format(tbNumber);
|
}
|
|
/**
|
* byte转MB
|
*/
|
public static double sizeToMb(long size) {
|
if (size < StaticData.D1050) {
|
return 0.001;
|
}
|
|
String str = String.format("%.3f", size / StaticData.D1024 / StaticData.D1024);
|
|
return Double.parseDouble(str);
|
}
|
|
/**
|
* 3.获取文件MD5码(JDK)
|
*/
|
public static String getMd5ByJdk(String filePath) throws IOException {
|
FileInputStream fileStream = new FileInputStream(filePath);
|
String md5 = DigestUtils.md5Hex(fileStream);
|
fileStream.close();
|
|
return md5;
|
}
|
|
/**
|
* 2.获取快速 MD5 码
|
*/
|
public static String getFastMd5(String filePath) throws IOException {
|
String hash = MD5.asHex(MD5.getHash(new File(filePath)));
|
|
MD5 md5 = new MD5();
|
md5.Update(hash, null);
|
|
return md5.asHex();
|
}
|
|
/**
|
* 删除文件
|
*/
|
public static void deleteFiles(List<MetaFileEntity> list) {
|
try {
|
for (MetaFileEntity mf : list) {
|
File f = new File(mf.getPath());
|
if (f.exists()) {
|
f.delete();
|
}
|
}
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
}
|
|
/**
|
* 删除文件夹
|
*
|
* @param dir 文件夹
|
*/
|
public static void deleteDir(String dir) {
|
File file = new File(dir);
|
|
deleteFiles(file);
|
}
|
|
/**
|
* 级联删除文件
|
*
|
* @param file 文件
|
*/
|
public static void deleteFiles(File file) {
|
if (null == file || !file.exists()) {
|
return;
|
}
|
|
if (file.isDirectory()) {
|
File[] files = file.listFiles();
|
if (null != files && files.length > 0) {
|
for (File f : files) {
|
if (f.isDirectory()) {
|
deleteFiles(f);
|
} else {
|
f.delete();
|
}
|
}
|
}
|
}
|
|
file.delete();
|
}
|
|
/**
|
* 获取相对路径
|
*
|
* @param file 文件
|
* @return 相对路径
|
*/
|
public static String getRelativePath(String file) {
|
if (StringHelper.isEmpty(file)) {
|
return null;
|
}
|
|
int idx = file.lastIndexOf(File.separator);
|
int start = file.lastIndexOf(File.separator, idx - 1);
|
|
return file.substring(start + 1);
|
}
|
|
/**
|
* 获取路径
|
*
|
* @param file 文件
|
* @return 文件路径
|
*/
|
public static String getPath(String file) {
|
if (StringHelper.isEmpty(file)) {
|
return null;
|
}
|
|
int end = file.lastIndexOf(File.separator);
|
|
return file.substring(0, end);
|
}
|
|
/**
|
* 1.获取文件的MD5
|
*/
|
@SuppressWarnings("unused")
|
public static String getFileMd5(String filePath) {
|
FileInputStream fis = null;
|
try {
|
MessageDigest md = MessageDigest.getInstance("MD5");
|
|
fis = new FileInputStream(new File(filePath));
|
FileChannel fChannel = fis.getChannel();
|
ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024);
|
|
while (fChannel.read(buffer) != -1) {
|
buffer.flip();
|
md.update(buffer);
|
buffer.compact();
|
}
|
byte[] b = md.digest();
|
|
return byteToHexString(b);
|
} catch (Exception ex) {
|
ex.printStackTrace();
|
return null;
|
} finally {
|
try {
|
if (null != fis) {
|
fis.close();
|
}
|
} catch (IOException ex) {
|
ex.printStackTrace();
|
}
|
}
|
}
|
|
/**
|
* 字节码转16进制
|
*/
|
public static String byteToHexString(byte[] tmp) {
|
// 每个字节用 16 进制表示的话,使用两个字符,
|
char[] str = new char[16 * 2];
|
|
// 所以表示成 16 进制需要 32 个字符,表示转换结果中对应的字符位置
|
int k = 0;
|
// 从第一个字节开始,对 MD5 的每一个字节
|
for (int i = 0; i < StaticData.SIXTEEN; i++) {
|
// 转换成 16 进制字符的转换
|
byte byte0 = tmp[i];
|
// 取字节中高 4 位的数字转换
|
str[k++] = StaticData.HEX_DIGITS[byte0 >>> 4 & 0xf];
|
// >>> 为逻辑右移,将符号位一起右移, 取字节中低 4 位的数字转换
|
str[k++] = StaticData.HEX_DIGITS[byte0 & 0xf];
|
}
|
// 换后的结果转换为字符串
|
return new String(str);
|
}
|
|
/**
|
* 获取字符串的MD5码
|
*/
|
public static String getStringMd5(String text) {
|
StringBuilder builder = new StringBuilder();
|
try {
|
MessageDigest md5 = MessageDigest.getInstance("MD5");
|
|
byte[] bytes = md5.digest(text.getBytes(StandardCharsets.UTF_8));
|
for (byte aByte : bytes) {
|
builder.append(Integer.toHexString((0x000000FF & aByte) | 0xFFFFFF00).substring(6));
|
}
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
|
return builder.toString();
|
}
|
|
/**
|
* 根据路径获取文件
|
*/
|
public static void getFilesByPath(List<File> list, String path) {
|
File file = new File(path);
|
if (file.isDirectory()) {
|
File[] files = file.listFiles();
|
if (null == files) {
|
return;
|
}
|
|
for (File f : files) {
|
if (f.isDirectory()) {
|
getFilesByPath(list, f.getPath());
|
} else {
|
list.add(f);
|
}
|
}
|
} else {
|
list.add(file);
|
}
|
}
|
|
/**
|
* 复制文件
|
*
|
* @param src 源文件
|
* @param dest 目录文件
|
*/
|
public static void copyFile(File src, File dest) throws IOException {
|
InputStream is = null;
|
OutputStream os = null;
|
try {
|
is = new FileInputStream(src);
|
os = new FileOutputStream(dest);
|
|
byte[] buffer = new byte[1024];
|
|
int length;
|
while ((length = is.read(buffer)) > 0) {
|
os.write(buffer, 0, length);
|
}
|
} finally {
|
os.close();
|
is.close();
|
}
|
}
|
}
|