亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Java編寫一個文件批量重命名工具

 更新時間:2024年12月30日 08:30:00   作者:望佑  
這篇文章主要為大家詳細介紹了如何使用Java編寫一個文件批量重命名工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習一下

背景

在開發(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.pngic_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)文章

  • springboot使用mybatis一對多的關(guān)聯(lián)查詢問題記錄

    springboot使用mybatis一對多的關(guān)聯(lián)查詢問題記錄

    這篇文章主要介紹了springboot使用mybatis一對多的關(guān)聯(lián)查詢問題記錄,剛好最近有個需求需要做到關(guān)聯(lián)的查詢,時間也算充足,所以用sql來寫,于是踩了很久坑,終于跳出來了,小小記錄一下
    2022-01-01
  • Spring聲明式事務(wù)@Transactional知識點分享

    Spring聲明式事務(wù)@Transactional知識點分享

    在本篇文章里小編給大家整理了關(guān)于Spring聲明式事務(wù)@Transactional詳解內(nèi)容,需要的朋友們可以參考下。
    2020-02-02
  • Java事件處理步驟講解

    Java事件處理步驟講解

    今天小編就為大家分享一篇關(guān)于Java事件處理步驟講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • RocketMQ延遲消息簡明介紹

    RocketMQ延遲消息簡明介紹

    這篇文章主要介紹了RocketMQ延遲消息,延遲消息是個啥?顧名思義,就是等一段時間再消費的消息。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-08-08
  • SpringBoot如何解析應(yīng)用參數(shù)args

    SpringBoot如何解析應(yīng)用參數(shù)args

    文章主要介紹了SpringBoot啟動過程中如何解析`main`函數(shù)中的參數(shù)`args`,包括如何解析命令行參數(shù)、訪問選項參數(shù)和非選項參數(shù),接著,介紹了`ApplicationArguments`接口及其方法,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 詳解記錄Java Log的幾種方式

    詳解記錄Java Log的幾種方式

    很多小伙伴不知道如何記錄日志,今天特地整理了本篇文章,文中有非常詳細的介紹及代碼示例,對小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 詳解Java語言中的抽象類與繼承

    詳解Java語言中的抽象類與繼承

    這篇文章主要為大家詳細介紹了Java語言中的抽象類與繼承的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習Java有一定的幫助,感興趣的小伙伴快跟隨小編一起了解一下
    2022-10-10
  • 詳解OpenFeign服務(wù)調(diào)用(微服務(wù))

    詳解OpenFeign服務(wù)調(diào)用(微服務(wù))

    OpenFeign是Spring Cloud在Feign的基礎(chǔ)上支持了SpringMVC的注解,如@RequesMapping等等,這篇文章主要介紹了OpenFeign服務(wù)調(diào)用的相關(guān)知識,需要的朋友可以參考下
    2022-07-07
  • java hasNextInt判斷是否為數(shù)字的方法

    java hasNextInt判斷是否為數(shù)字的方法

    今天小編就為大家分享一篇java hasNextInt判斷是否為數(shù)字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java中seata框架的XA模式詳解

    Java中seata框架的XA模式詳解

    這篇文章主要介紹了Java中seata框架的XA模式詳解,Seata?是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡單易用的分布式事務(wù)服務(wù),Seata?將為用戶提供了?AT、TCC、SAGA?和?XA?事務(wù)模式,為用戶打造一站式的分布式解決方案,需要的朋友可以參考下
    2023-08-08

最新評論