java實現(xiàn)文件重命名
背景
我們經(jīng)常在網(wǎng)上下載一些視頻教程,然而這些視頻命名規(guī)則各不相同,即使對于相同類型的文件名來說,當(dāng)文件數(shù)量很大且文件名全部是中文時,文件排序是非規(guī)則的,因此本篇博客主要講解一種改變文件夾名稱使得文件按照規(guī)律進行排序。
思路
根據(jù)文件名對文件進行排序,然后重命名文件即可。
代碼
規(guī)則:如 將文件名中帶有 “第八講 ”替換成“8”:
構(gòu)建排序規(guī)則
/*** * @param filePath 文件夾位置 * @param startWorld 開始替換的字 * @param endWorld 結(jié)束替換的字 */ private void ReName(String filePath, String startWorld, String endWorld) { File file = new File(filePath); if (!file.exists() || !file.isDirectory()) { System.out.println("文件不存在"); return; } String[] list = file.list(); //以 第xxx講-文件全名 的鍵值對存儲文件 HashMap<String, String> paths = new HashMap<String, String>(); for (String str : list) { int start = str.indexOf(startWorld) + 1; int end = str.indexOf(endWorld); if (start != 0 && end != -1) { paths.put(str.substring(start, end), str); } else { System.out.println("文件 " + str + " 不滿足替換條件"); } } //對文件名進行排序 orderPath(filePath, endWorld, paths); }
排序
private void orderPath(String filePath, String endWorld, HashMap<String, String> paths) { if (paths.isEmpty()) { return; } TreeMap<Integer, String> map = new TreeMap<Integer, String>(); for (String str : paths.keySet()) { map.put(parseInt(str), paths.get(str)); } //重命名該文件 ReNameFile(filePath, endWorld, map); }
重命名
private void ReNameFile(String filePath, String endWorld, TreeMap<Integer, String> map) { for (int i : map.keySet()) { String path = map.get(i); File f = new File(filePath + File.separator + path); File dest = new File(filePath + File.separator + i + path.substring(path.indexOf(endWorld) + 1)); if (f.exists() && !dest.exists()) { f.renameTo(dest); } f = null; dest = null; } }
將中文描述的數(shù)字轉(zhuǎn)換為數(shù)字,如將 一百二十轉(zhuǎn)換為120
private int parseInt(String str) { if (str.length() == 1) { if (str.equals("十")) { return 10; } return getInt(str.charAt(0)); } else { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c != '百' && c != '十') { sb.append(getInt(c)); } } int res = Integer.parseInt(sb.toString()); if (str.charAt(str.length() - 1) == '百') { res *= 100; } else if (str.charAt(str.length() - 1) == '十') { res *= 10; } if (str.charAt(0) == '十') { res += 10; } return res; } }
完整代碼
import java.io.File; import java.util.HashMap; import java.util.TreeMap; /** * 將一個文件夾中所有滿足條件的文件名替換 * <p> * 條件:將從開始字到結(jié)束字的字符串替換成對應(yīng)的數(shù)字 * <p> * 如:第八講 替換成 8 */ public class Main { public static void main(String[] args) { Main m = new Main(); // 文件夾位置 String filePath = "D:\\新建文件夾\\OOAD與UML教學(xué)視頻"; // 從哪個字(startWorld)開始替換到哪個字(endWorld)結(jié)束 String startWorld = "第"; String endWorld = "講"; m.ReName(filePath, startWorld, endWorld); } /*** * @param filePath 文件夾位置 * @param startWorld 開始替換的字 * @param endWorld 結(jié)束替換的字 */ private void ReName(String filePath, String startWorld, String endWorld) { File file = new File(filePath); if (!file.exists() || !file.isDirectory()) { System.out.println("文件不存在"); return; } String[] list = file.list(); //以 第xxx講-文件全名 的鍵值對存儲文件 HashMap<String, String> paths = new HashMap<String, String>(); for (String str : list) { int start = str.indexOf(startWorld) + 1; int end = str.indexOf(endWorld); if (start != 0 && end != -1) { paths.put(str.substring(start, end), str); } else { System.out.println("文件 " + str + " 不滿足替換條件"); } } //對文件名進行排序 orderPath(filePath, endWorld, paths); } private void orderPath(String filePath, String endWorld, HashMap<String, String> paths) { if (paths.isEmpty()) { return; } TreeMap<Integer, String> map = new TreeMap<Integer, String>(); for (String str : paths.keySet()) { map.put(parseInt(str), paths.get(str)); } //重命名該文件 ReNameFile(filePath, endWorld, map); } private void ReNameFile(String filePath, String endWorld, TreeMap<Integer, String> map) { for (int i : map.keySet()) { String path = map.get(i); File f = new File(filePath + File.separator + path); File dest = new File(filePath + File.separator + i + path.substring(path.indexOf(endWorld) + 1)); if (f.exists() && !dest.exists()) { f.renameTo(dest); } f = null; dest = null; } } private int parseInt(String str) { if (str.length() == 1) { if (str.equals("十")) { return 10; } return getInt(str.charAt(0)); } else { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c != '百' && c != '十') { sb.append(getInt(c)); } } int res = Integer.parseInt(sb.toString()); if (str.charAt(str.length() - 1) == '百') { res *= 100; } else if (str.charAt(str.length() - 1) == '十') { res *= 10; } if (str.charAt(0) == '十') { res += 10; } return res; } } private int getInt(char c) { int res = -1; switch (c) { case '一': res = 1; break; case '二': res = 2; break; case '三': res = 3; break; case '四': res = 4; break; case '五': res = 5; break; case '六': res = 6; break; case '七': res = 7; break; case '八': res = 8; break; case '九': res = 9; break; case '零': res = 0; break; } return res; } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用LambdaQueryWrapper動態(tài)加過濾條件?動態(tài)Lambda
這篇文章主要介紹了使用LambdaQueryWrapper動態(tài)加過濾條件?動態(tài)Lambda,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01Java使用PrepareStatement實現(xiàn)數(shù)據(jù)的插入與查詢操作
這篇文章主要為大家詳細介紹了Java如何使用PrepareStatement實現(xiàn)數(shù)據(jù)的插入與查詢操作,文中的示例代碼講解詳細,感興趣的可以了解一下2022-09-09springboot通過SchedulingConfigurer實現(xiàn)多定時任務(wù)注冊及動態(tài)修改執(zhí)行周期(示例詳解)
這篇文章主要介紹了springboot通過SchedulingConfigurer實現(xiàn)多定時任務(wù)注冊及動態(tài)修改執(zhí)行周期,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06java實現(xiàn)163郵箱發(fā)送郵件到qq郵箱成功案例
這篇文章主要為大家分享了java實現(xiàn)163郵箱發(fā)送郵件到qq郵箱成功案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05