使用Java編寫一個文件批量重命名工具
背景
在開發(fā)移動應(yīng)用時,UI設(shè)計通常會提供不同分辨率的圖片資源來適配多種屏幕尺寸。例如,在一個特定的應(yīng)用場景中,seekbar范圍0-64對應(yīng)64張圖片,用于滑動切換不同的顏色背景。設(shè)計師提供了"xhdpi", "xxhdpi", "xxxhdpi"三種不同尺寸的圖片集,總共192張圖片。手動為這些圖片添加前綴或進行其他格式化操作既耗時又容易出錯。因此,為了提高效率并減少人為錯誤,這里編寫了一個Java工具類FileRenamer,用以自動化這個過程。
處理
1. 文件夾檢查與遍歷
首先,FileRenamer類定義了新文件名的前綴和源文件夾路徑。然后通過rename()方法獲取指定路徑下的文件夾對象,并驗證其有效性。接下來,它遍歷預(yù)設(shè)的子文件夾(如"xhdpi", "xxhdpi", "xxxhdpi"),對每個存在的子文件夾調(diào)用processSubFolder()方法進行進一步處理。
2. 批量重命名
在processSubFolder()方法中,程序篩選出所有.png文件,并使用正則表達式匹配文件名中的數(shù)字和顏色值。根據(jù)匹配結(jié)果構(gòu)造新的文件名,將原有的數(shù)字部分保留下來,同時將文件名更改為帶有指定前綴的形式,如從0_color_ffff00.png到ic_wangyou_color0_ffffff.png。成功重命名后,程序會輸出確認信息;若失敗,則記錄下錯誤。
3. 輸出配置代碼片段
最后,outputCodeSnippet()方法負責生成一段可以復(fù)制粘貼到工程配置中的代碼片段。該方法先過濾并排序符合新前綴的所有PNG文件,然后構(gòu)造包含這些文件引用的字符串。此外,它還會列出未被包含的文件,以便開發(fā)者檢查是否有遺漏。
完整代碼
通過上述步驟,FileRenamer實現(xiàn)了批量重命名圖片文件的功能,并自動生成了配置代碼片段,極大地簡化了資源管理的工作量。以下是該工具類的完整源碼:
package com.wang.you.util;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class FileRenamer {
private static final String NEW_PREFIX = "ic_wangyou_color";
private static final String FOLDER_PATH = "/storage/emulated/0/wangyou";
public static void rename() {
File folder = new File(FOLDER_PATH);
if (!folder.exists() || !folder.isDirectory()) {
System.out.println("指定的路徑不是一個有效的文件夾!");
return;
}
String[] subFolders = {"xhdpi", "xxhdpi", "xxxhdpi"};
for (String subFolderName : subFolders) {
File subFolder = new File(folder, subFolderName);
if (subFolder.exists() && subFolder.isDirectory()) {
processSubFolder(subFolder);
} else {
System.out.println("子文件夾 " + subFolderName + " 不存在或不是一個有效的文件夾!");
}
}
}
private static void processSubFolder(File subFolder) {
File[] files = subFolder.listFiles((dir, name) -> name.toLowerCase().endsWith(".png"));
if (files == null || files.length == 0) {
System.out.println("在文件夾 " + subFolder.getName() + " 中沒有找到任何 .png 文件!");
return;
}
for (File oldFile : files) {
String oldFileName = oldFile.getName();
Pattern pattern = Pattern.compile("(\\d+)_(\\w+\\.png)");
Matcher matcher = pattern.matcher(oldFileName);
if (matcher.matches()) {
String numberPart = matcher.group(1);
String colorValueWithExt = matcher.group(2);
String colorValue = colorValueWithExt.split("\\.")[0];
String newFileName = NEW_PREFIX + numberPart + "_" + colorValue + ".png";
File newFile = new File(subFolder, newFileName);
if (oldFile.renameTo(newFile)) {
System.out.println("Renamed: " + oldFileName + " -> " + newFileName);
} else {
System.out.println("Failed to rename: " + oldFileName);
}
} else {
System.out.println("Invalid file name format: " + oldFileName);
}
}
outputCodeSnippet(subFolder);
}
private static void outputCodeSnippet(File folder) {
Pattern pattern = Pattern.compile("(?<=color)(\\d+)(?=_)");
List<File> allPngFiles = Arrays.stream(folder.listFiles())
.filter(file -> file.getName().toLowerCase().endsWith(".png"))
.collect(Collectors.toList());
List<File> renamedFiles = allPngFiles.stream()
.filter(file -> file.getName().startsWith(NEW_PREFIX))
.sorted((f1, f2) -> {
Matcher m1 = pattern.matcher(f1.getName());
Matcher m2 = pattern.matcher(f2.getName());
if (m1.find() && m2.find()) {
return Integer.compare(Integer.parseInt(m1.group()), Integer.parseInt(m2.group()));
}
return 0;
})
.collect(Collectors.toList());
System.out.println("準備輸出字符串renamedFiles: " + renamedFiles.size());
StringBuilder outputString = new StringBuilder("private final int[] wangyou_colorArr_" + folder.getName() + " = new int[]{\n");
for (File file : renamedFiles) {
String fileNameWithoutExtension = file.getName().replaceFirst("[.][^.]+$", "");
outputString.append(" R.mipmap.")
.append(fileNameWithoutExtension)
.append(",\n");
}
if (outputString.toString().endsWith(",\n")) {
outputString.setLength(outputString.length() - 2);
}
outputString.append("\n};");
System.out.println(outputString.toString());
List<File> unmatchedFiles = allPngFiles.stream()
.filter(file -> !file.getName().startsWith(NEW_PREFIX))
.collect(Collectors.toList());
if (!unmatchedFiles.isEmpty()) {
System.out.println("以下文件未被包含:");
unmatchedFiles.forEach(file -> System.out.println(" " + file.getName()));
}
}
}
這段代碼不僅解決了大批量圖片文件的重命名問題,還自動生成了對應(yīng)的資源數(shù)組,使得能夠輕松地在項目中集成這些資源。這里只是一個示例,當然啦,實際使用要根據(jù)不同的文件名稱去處理,照搬肯定是不行的
到此這篇關(guān)于使用Java編寫一個文件批量重命名工具的文章就介紹到這了,更多相關(guān)Java文件批量重命名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot?結(jié)合?WxJava?實現(xiàn)文章上傳微信公眾號草稿箱與群發(fā)
本文將詳細介紹如何使用SpringBoot框架結(jié)合WxJava開發(fā)工具包,實現(xiàn)文章上傳到微信公眾號草稿箱以及群發(fā)功能,感興趣的朋友一起看看吧2025-07-07
SpringBoot事務(wù)失效的七種場景分析及解決方案
Spring Boot 中的事務(wù)失效通常是由于代理機制、異常處理、傳播行為配置不當?shù)仍蛞鸬?通過合理配置和排查,可以有效避免事務(wù)失效問題,所以本文給大家總結(jié)了SpringBoot事務(wù)失效的七種場景分析及解決方案,需要的朋友可以參考下2025-05-05

