Android java代码中的String硬编码抽取

1、思路:java文件中的string硬编码无法像layout文件中的string硬编码那样可以批量替换,所以换种思路,我们只做抽取,不做替换。假如我们有一个hashmap,key是繁体中文,value是简体中文,我们在代码中的string硬编码都写成getStr("测试")这样。getStr方法的伪代码如下:

 public static String getStr(String key) {
        if (curLang.equals("繁体中文")) {//如果当前语言是繁体中文,则直接返回key
            return key;
        } else {
            String value = hashmap.get(key);//否则获取value,返回简体中文
            if (value == null) {//如果为null,则直接用繁体中文
                return key;
            } else {
                return value;
            }
        }
    }

这样,问题的关键就是hashmap的生成了。生成hashmap初始化代码的字符串:使用正则表达式getStr\\(\".*?\"\\)拿到所有的中文硬编码,然后使用System.out.print打印。

2、主要代码:SearchAndroidCodeText 类

package com.ivan.demo;

import com.ivan.demo.utils.ZHConverter;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//查找java目录下的java文件的中文硬编码,打印hashmap初始化代码字符串
public class SearchAndroidCodeText {
    private static List<String> stringList = new ArrayList<>();

    public static void readToString(String fileName, String keyWord) {
        String encoding = "UTF-8";
        File file = new File(fileName);
        Long filelength = file.length();
        byte[] filecontent = new byte[filelength.intValue()];
        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            in.read(filecontent);
            in.close();
            String content = new String(filecontent, encoding);
            Pattern pat = Pattern.compile(keyWord);
            Matcher mat = pat.matcher(content);
            while (mat.find()) {
                String resultStr = mat.group(0);
                String resultKey = resultStr.replace("getStr(", "");
                resultKey = resultKey.substring(0, resultKey.length() - 1);
                stringList.add(resultKey);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件
        File[] subFiles = folder.listFiles();
        if (subFiles == null) {
            return;
        }
        for (int i = 0; i < subFiles.length; i++) {// 循环遍历文件夹或文件
            if (subFiles[i].isFile()) {
                if (subFiles[i].getName().endsWith(".java")) {
                    //System.out.println(subFiles[i].getName());
                    readToString(subFiles[i].getAbsolutePath(), keyWord);
                }
            } else if (subFiles[i].isDirectory()) {// 如果是文件夹,则递归调用本方法
                searchFile(subFiles[i], keyWord);
            }
        }
    }

    //去掉重复string
    public static List<String> removeDuplicate(List<String> list) {
        List<String> listTemp = new ArrayList();
        for (int i = 0; i < list.size(); i++) {
            if (!listTemp.contains(list.get(i))) {
                listTemp.add(list.get(i));
            }
        }
        return listTemp;
    }


    public static void main(String[] args) throws Exception {// java程序的主入口处
        String dirPath = "D:\\code\\studio\\StringInternationalDemo\\app\\src\\main\\java";
        File folder = new File(dirPath);// 默认目录
        String keyword = "getStr\\(\".*?\"\\)";//?表示贪婪模式
        if (!folder.exists()) {// 如果文件夹不存在
            System.out.println("目录不存在:" + folder.getAbsolutePath());
            return;
        }
        //第一步:查找java文件中的中文硬编码
        searchFile(folder, keyword);
        stringList = removeDuplicate(stringList);
        //第二步:生成hashmap的初始化代码字符串
        ZHConverter converter = ZHConverter.getInstance(ZHConverter.SIMPLIFIED);//将繁体中文改成简体中文
        for (String key : stringList) {
            String value = converter.convert(key);
            System.out.println("data.put(" + key + "," + value + ");");
        }
    }
}

3、代码下载地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhifanxu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值