Java读取CSV扩展短信缩写后无法在if外获取修改后字符串求助
现有代码核心问题
你提到的字符串作用域问题不存在:bodyOut是在方法开头定义的,整个方法作用域内都可访问,你遇到的问题是写文件的逻辑位置错误:
- 当前写文件逻辑放在
if判断分支内,每匹配到一个缩写就会生成一个新的txt文件,写入的是仅完成当前缩写替换的半成品内容,并没有等所有缩写都替换完成再统一存储。
其他可优化点
- 冗余判断:
if (messageBody.contains(key))可以直接去掉,Java的String.replace方法本身找不到目标内容时会直接返回原字符串,额外加contains判断相当于多遍历一次字符串,反而降低性能。 - 资源泄漏风险:写文件的
FileWriter没有用自动资源管理,极端场景下会出现流未正常关闭的问题。 - 重复IO开销:每次调用
AbrExpander方法都会重新读取一次CSV文件加载映射表,如果该方法会被多次调用,会造成不必要的IO浪费。 - 误匹配风险:当前替换是全局字符匹配,比如缩写为
ok时,消息中的okay也会被误替换,可按需改为全词匹配逻辑。
优化后代码
import java.io.*; import java.util.HashMap; import java.util.regex.Pattern; public class AbbreviationExpander { // 可选优化:静态块加载映射表,仅类初始化时读一次CSV private static final HashMap<String, String> ABBREVIATION_MAP = new HashMap<>(); private static final String CSV_FILE = "textwords.csv"; private static final String CSV_SPLIT_BY = ","; static { try (BufferedReader br = new BufferedReader(new FileReader(CSV_FILE))) { String line; while ((line = br.readLine()) != null) { String[] abbreviationPair = line.split(CSV_SPLIT_BY); // 过滤异常行,避免数组越界 if (abbreviationPair.length >= 2) { ABBREVIATION_MAP.put(abbreviationPair[0].trim(), abbreviationPair[1].trim()); } } } catch (IOException e) { e.printStackTrace(); } } static void abrExpander(String messageBody) { String bodyOut = messageBody; // 遍历替换所有缩写 for (String key : ABBREVIATION_MAP.keySet()) { // 普通全局替换,不需要全词匹配就用这个 bodyOut = bodyOut.replace(key, key + "<" + ABBREVIATION_MAP.get(key).toLowerCase() + ">"); // 可选:全词匹配,避免误替换,需要用正则的话就把上面那行换成下面这个 // bodyOut = bodyOut.replaceAll("\\b" + Pattern.quote(key) + "\\b", "$0<" + ABBREVIATION_MAP.get(key).toLowerCase() + ">"); } // 全部替换完成后统一写文件 File file = new File("SMS message" + System.currentTimeMillis() + ".txt"); try (FileWriter myWriter = new FileWriter(file)) { myWriter.write(bodyOut); } catch (IOException e) { System.out.println("An error occurred."); e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Danshaw
相关产品推荐
相关产品推荐

