使用Java編寫一個文件批量重命名工具
背景
在開發(fā)移動應用時,UI設計通常會提供不同分辨率的圖片資源來適配多種屏幕尺寸。例如,在一個特定的應用場景中,seekbar范圍0-64對應64張圖片,用于滑動切換不同的顏色背景。設計師提供了"xhdpi", "xxhdpi", "xxxhdpi"三種不同尺寸的圖片集,總共192張圖片。手動為這些圖片添加前綴或進行其他格式化操作既耗時又容易出錯。因此,為了提高效率并減少人為錯誤,這里編寫了一個Java工具類FileRenamer,用以自動化這個過程。
處理
1. 文件夾檢查與遍歷
首先,FileRenamer類定義了新文件名的前綴和源文件夾路徑。然后通過rename()方法獲取指定路徑下的文件夾對象,并驗證其有效性。接下來,它遍歷預設的子文件夾(如"xhdpi", "xxhdpi", "xxxhdpi"),對每個存在的子文件夾調用processSubFolder()方法進行進一步處理。
2. 批量重命名
在processSubFolder()方法中,程序篩選出所有.png文件,并使用正則表達式匹配文件名中的數(shù)字和顏色值。根據(jù)匹配結果構造新的文件名,將原有的數(shù)字部分保留下來,同時將文件名更改為帶有指定前綴的形式,如從0_color_ffff00.png到ic_wangyou_color0_ffffff.png。成功重命名后,程序會輸出確認信息;若失敗,則記錄下錯誤。
3. 輸出配置代碼片段
最后,outputCodeSnippet()方法負責生成一段可以復制粘貼到工程配置中的代碼片段。該方法先過濾并排序符合新前綴的所有PNG文件,然后構造包含這些文件引用的字符串。此外,它還會列出未被包含的文件,以便開發(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()));
}
}
}
這段代碼不僅解決了大批量圖片文件的重命名問題,還自動生成了對應的資源數(shù)組,使得能夠輕松地在項目中集成這些資源。這里只是一個示例,當然啦,實際使用要根據(jù)不同的文件名稱去處理,照搬肯定是不行的
到此這篇關于使用Java編寫一個文件批量重命名工具的文章就介紹到這了,更多相關Java文件批量重命名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot使用mybatis一對多的關聯(lián)查詢問題記錄
這篇文章主要介紹了springboot使用mybatis一對多的關聯(lián)查詢問題記錄,剛好最近有個需求需要做到關聯(lián)的查詢,時間也算充足,所以用sql來寫,于是踩了很久坑,終于跳出來了,小小記錄一下2022-01-01
Spring聲明式事務@Transactional知識點分享
在本篇文章里小編給大家整理了關于Spring聲明式事務@Transactional詳解內(nèi)容,需要的朋友們可以參考下。2020-02-02
java hasNextInt判斷是否為數(shù)字的方法
今天小編就為大家分享一篇java hasNextInt判斷是否為數(shù)字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

