[TOC]
在bilibili上下载了学习视频,bili的客户端看视频非常不方便,习惯用potplayer看视频;但是bili上下载视频的文件名都是类似50200264_1_0.flv
这样格式,所以就修改成bili上对应的详细介绍的文件名,类似01 介绍及快速搭建 Spring Boot 项目
这个格式的。
查看下载视频的目录,发现在视频全集下面分了两层目录
最底层有三个文件,其中flv
文件,是视频文件,也是需要重命名的文件; xml
文件记录的是弹幕; info
文件记录的是文件信息,查看info
文件可知,有个 "PartName" 字段记录的是文件名,获取这个字段信息即可。
info
文件,截取"PartName"
字段信息即文件名,排序后将文件名保存到临时文件demo.txt
demo.txt
文件内容,修改成整齐的格式flv
文件的文件名,并截取其中的序号,比如 50200264_1_0.flv
,获取中间的序号1
,作为index
demo.txt
文件,将读取的文件名保存到ArrayList
中,通过步骤4中的index-1
获取将info
结尾的文件保存到fileList
中
/**
* 遍历文件夹,将info结尾的文件保存到fileList中
* @param filePath
* @return
*/
public static List getFileList(String filePath) {
File dir = new File(filePath);
// 该文件目录下文件全部放入数组
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getName();
// 判断是文件还是文件夹
if (files[i].isDirectory()) {
// 获取文件绝对路径
getFileList(files[i].getAbsolutePath());
} else if (fileName.endsWith("info")) {
// 判断文件名是否是以info结尾
String strFileName = files[i].getAbsolutePath();
fileList.add(files[i]);
} else {
continue;
}
}
}
return fileList;
}
获取“PartName”字段信息,将字符串添加到list列表,并进行排序
/**
* 获取“PartName”字段信息,将字符串添加到list列表,并进行排序
* @param fileListNew 新的文件列表
* @return
*/
public static List sortString(List fileListNew) {
List strList = new ArrayList<>(16);
for (int i = 0; i < fileListNew.size(); i++) {
File file = fileListNew.get(i);
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String str;
while ((str = br.readLine()) != null) {
// 获取“PartName”字段对应的文件名
String partName = str.split(",")[18].split(":")[1];
// 字文件名添加到List
strList.add(partName);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 排序获取到的文件名
Collections.sort(strList);
return strList;
}
将排序后的字符串写入到文件中
/**
* 将排序后的字符串写入到文件中
* @param newFileName 新文件路径
* @param stringList 字符串列表
* @throws IOException
*/
public static void writeFile(String newFileName, List stringList) throws IOException {
FileWriter fw = new FileWriter(newFileName);
BufferedWriter bw = new BufferedWriter(fw);
for (int i = 0; i < stringList.size(); i++) {
String str = stringList.get(i);
bw.append(str + "\r\n");
}
bw.close();
}
将flv
文件名,保存到fileList
中
/**
* 遍历文件夹,将flv结尾的文件名,添加到fileList中
*
* @param filePath
* @return
*/
public List getFileList(String filePath) {
File dir = new File(filePath);
// 该文件目录下文件全部放入数组
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getName();
// 判断是文件还是文件夹
if (files[i].isDirectory()) {
// 获取文件绝对路径
getFileList(files[i].getAbsolutePath());
} else if (fileName.endsWith("flv")) {
// 判断文件名是否是以flv结尾
String strFileName = files[i].getAbsolutePath();
// logger.info("strFileName : " + strFileName);
fileList.add(files[i]);
} else {
continue;
}
}
}
return fileList;
}
从demo.txt
文件中,获取目标文件名,并添加到List中
/**
* 读取demo.txt文件,获取目标文件名,并添加到ArrayList中
* @param file
* @return
*/
public List readeFile(File file) {
List strList = new ArrayList<>();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String lines;
while ((lines = br.readLine()) != null) {
strList.add(lines);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return strList;
}
读取demo.txt
文件获取目标文件名,并通过遍历fileList获取flv
文件名,然后重命名
/**
* 重命名文件
* @param demo demo.txt文件
*/
public void renameToEnd(File demo) {
// 读取demo.txt中的文件名,并保存demoList中
List demoList = readeFile(demo);
for (int i = 0; i < fileList.size(); i++) {
// 获取flv文件
File fileOld = fileList.get(i);
// 截取flv文件名中的序号
String str = fileOld.getName().split("_")[1];
// 将String类型的序号转成int类型
int anInt = Integer.parseInt(str);
// 获取flv文件的路径
String newPathTemp = fileOld.getPath().split("57936239_")[0];
String newPath = newPathTemp.endsWith("\\") ? newPathTemp : newPathTemp+"\\";
// 拼接成新的文件名
String newFileName = newPath + demoList.get(anInt-1) + ".flv";
// 创建新的文件
File dest = new File(newFileName);
// 重命名
if (fileOld.renameTo(dest)) {
System.out.println("重命名成功: " + dest.getName());
}
}
}
修改后的结果如下,需要注意的是,修改文件名后,bilibili的客户端就不能再查看文件了。
PotPlayer文件列表展示如下: