importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.Transparency;importjava.awt.font.FontRenderContext;importjava.awt.geom.AffineTransform;importjava.awt.geom.Rectangle2D;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.nio.channels.FileChannel;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjava.util.Set;importjavax.imageio.ImageIO;/*** 工具类功能:
* 1.通过文件路径获取相关信息
* 2.生成新的文件地址
* 3.读取、复制、删除文件
* 4.根据文本字体大小生成背景透明的png图片
*@authormaxinhai
**/
public classFileUtils {/*** 程序可处理视频类型*/
private static Set fileTypeSet = new HashSet<>();static{
fileTypeSet.add("mp4");
fileTypeSet.add("flv");
fileTypeSet.add("avi");
fileTypeSet.add("rm");
fileTypeSet.add("rmvb");
fileTypeSet.add("wmv");
}/*** 获取指定文件的后缀名
*@paramfile
*@return
*/
public staticString getFormat(File file) {
String fileName=file.getName();
String format= fileName.substring(fileName.indexOf(".") + 1);returnformat;
}/*** 读取某个文件夹下的所有视频文件
*
*@paramfilePath 要读取的路径
*@return
*/
public static ListreadDic(String filePath) {
List fileList = new ArrayList<>();
File file= new File(filePath); //获取其file对象
readDic(file, fileList);returnfileList;
}/*** 读取目录
*
*@paramfile
*@paramfileList*/
private static void readDic(File file, ListfileList) {
File[] fs=file.listFiles();for(File f : fs) {//若是目录,则递归打印该目录下的文件
if(f.isDirectory()) {
readDic(f, fileList);
}//若是文件,直接打印
if (f.isFile() &&isVideo(f.getAbsolutePath().toString())) {
fileList.add(f.getAbsolutePath().toString());
}
}
}/*** 判断文件不否是视频
*
*@paramfileName
*@return
*/
public static booleanisVideo(String fileName) {if (fileName.indexOf(".") == -1) {return false;
}
String fileType= fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());returnfileTypeSet.contains(fileType);
}/*** 获得视频文件格式
*
*@paramvideoPath
*@return
*/
public staticString getVideoSuffix(String videoPath) {return videoPath.substring(videoPath.lastIndexOf("."));
}/*** 根据文件路径获取文件名
*@paramfilePath
*@return不带文件格式的文件名*/
public staticString getFileName(String filePath) {int startIndex = filePath.lastIndexOf("\\");return filePath.substring(startIndex+1, filePath.length());
}/*** 根据文件路径获取文件名称带后缀
*@paramfilePath
*@return
*/
public staticString getFileNameAndSuffix(String filePath) {int startIndex = filePath.lastIndexOf("\\");int lastIndex = filePath.lastIndexOf(".");return filePath.substring(startIndex+1, lastIndex);
}/*** 功能描述 生成新的文件路径
*
*@paramcurrentVideo : 原来文件路径
*@returntargetPath : 新的文件路径
*@authorxinhai.ma
* @date 2020/5/9 14:33*/
public staticString getNewFilePath(String currentVideo, String folderPath) {
String targetPath= null;if (null ==currentVideo) {
targetPath= folderPath + File.separator + getTimeStr() + ".mp4";
}else{
targetPath= folderPath + "\\" + getTimeStr() +getVideoSuffix(currentVideo);
}returntargetPath;
}/*** 获得格式化后的当前时间
*
*@return
*/
public staticString getTimeStr() {
DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
LocalDateTime createTime=LocalDateTime.now();returncreateTime.format(formatter);
}/*** 获取简洁路径
*
*@parampath 文件路径
*@return简洁路径*/
public staticString getSimplePath(String path) {int firstIndex = path.indexOf("\\");int lastIndex = path.lastIndexOf("\\");
String begin= path.substring(0, firstIndex + 1);
String end=path.substring(lastIndex, path.length());return begin + "..." +end;
}/*** 获取简洁路径集合
*
*@parampathList 文件路径集合
*@return简洁路径集合*/
public static List getSimplePathList(ListpathList) {
List simplePathList = new ArrayList<>(pathList.size());
pathList.forEach(path->{if (!path.equals("暂无数据")) {
simplePathList.add(getSimplePath(path));
}
});returnsimplePathList;
}/*** 创建多重文件夹及文件
*
*@paramfolderPath 文件夹路径
*@paramfilePath 文件名称及后缀*/
public static voidcreateFile(String folderPath, String filePath) {
File folder= newFile(folderPath);
File file= new File(folderPath + File.separator +filePath);if (!folder.isFile() && !folder.exists()) {
folder.mkdirs();
}if (!file.exists()) {try{boolean result =file.createNewFile();if (!result) {
System.out.println("创建文件失败! {}" + folderPath + File.separator +filePath);
}else{
System.out.println("创建文件成功!" + folderPath + File.separator +filePath);
}
}catch(IOException e) {
e.printStackTrace();
}
}
}/*** 删除文件
*
*@paramfilePath 文件路径
*@return删除结果*/
public static booleandeleteFile(String filePath) {boolean result = false;
File file= newFile(filePath);if(file.exists()) {
file.delete();
result= true;
}returnresult;
}/*** 复制文件
*
*@paramsourcePath 要复制的文件路径
*@paramtargetPath 复制到的路径*/
public static voidcopyFile(String sourcePath, String targetPath) {
FileInputStream fi= null;
FileOutputStream fo= null;
FileChannel in= null;
FileChannel out= null;try{
fi= newFileInputStream(sourcePath);
fo= newFileOutputStream(targetPath);
in= fi.getChannel();//得到对应的文件通道
out = fo.getChannel();//得到对应的文件通道
in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道
} catch(IOException e) {
e.printStackTrace();
}finally{try{
fi.close();
in.close();
fo.close();
out.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}/*** 同步复制文件
*@paramsourceFolderPath 要复制的文件夹
*@paramtargetFolderPath 目标文件夹*/
public static voidbatchCopyFile(String sourceFolderPath, String targetFolderPath) {
File sourceFolder= newFile(sourceFolderPath);
File targetFolder= newFile(targetFolderPath);if (!sourceFolder.exists()) {new RuntimeException(sourceFolderPath + "路径不存在!");
}if (!targetFolder.exists()) {new RuntimeException(targetFolderPath + "路径不存在!");
}if(sourceFolder.isFile()) {new RuntimeException(sourceFolderPath + "不是文件夹!");
}if(targetFolder.isFile()) {new RuntimeException(targetFolderPath + "不是文件夹!");
}
File[] files=sourceFolder.listFiles();for(int i=0; i
String source=files[i].getAbsolutePath();
String target= targetFolderPath + File.separator +files[i].getName();
copyFile(source, target);
}
}/*** 同步复制文件
*@paramfilePathList 文件地址集合
*@paramtargetFolderPath 目标文件夹*/
public static List batchCopyFile(ListfilePathList, String targetFolderPath) {
List targetPathList = new ArrayList<>(filePathList.size());
File targetFolder= newFile(targetFolderPath);if (!targetFolder.exists()) {new RuntimeException(targetFolderPath + "路径不存在!");
}if(targetFolder.isFile()) {new RuntimeException(targetFolderPath + "不是文件夹!");
}
filePathList.forEach(path->{
String target= targetFolderPath + File.separator +getFileName(path);
copyFile(path, target);
targetPathList.add(target);
});returntargetPathList;
}/*** 根据文字生成png图片,并返回图片路径
*@paramdrawStr
*@paramfont
*@paramtargetPath
*@return
*/
public static voidcreateImage(String drawStr, Font font, File targetPath) {//获取font的样式应用在str上的整个矩形
Rectangle2D r= font.getStringBounds(drawStr, new FontRenderContext(AffineTransform.getScaleInstance(1, 1),false,false));int unitHeight=(int)Math.floor(r.getHeight());//获取单个字符的高度//获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度
int width=(int)Math.round(r.getWidth())+1;int height=unitHeight+3;//把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度//创建图片
BufferedImage image = newBufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Graphics2D g=image.createGraphics();//设置透明 start
image =g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g=image.createGraphics();//设置透明 end
g.setFont(font); //设置字体
g.setColor(Color.ORANGE); //设置颜色//g.drawRect(0, 0, width - 1, height - 1);//画边框
g.drawString(drawStr, 0, font.getSize());
g.dispose();try{//输出png图片
ImageIO.write(image, "png", targetPath);
}catch(IOException e) {
e.printStackTrace();
}
}
}