
本文介绍使用 node.js 的 readline 模块逐行读取文件,检测是否包含 createevent 方法且未添加 @circuit 注解,并在匹配行末自动插入注解;若全文件未匹配,则在文件末尾追加该注解。
本文介绍使用 node.js 的 readline 模块逐行读取文件,检测是否包含 createevent 方法且未添加 @circuit 注解,并在匹配行末自动插入注解;若全文件未匹配,则在文件末尾追加该注解。
在 Node.js 中对源码文件进行条件性修改(如注入注解),需兼顾准确性、可读性与安全性。直接用 fs.readFile 一次性加载可能引发内存压力(尤其大文件),而纯流式 data 事件处理又难以精准识别跨行结构(如方法声明换行)。因此,推荐采用 readline 模块按行解析——它天然支持以行为单位的语义处理,完美适配 Java 等面向行的编程语言。
以下是一个健壮、可复用的实现方案:
const fs = require('fs');
const readline = require('readline');
async function appendData() {
const file_path = './File/controller.java';
const output_path = './FileUpload/auditcontroller_test.java';
const annotation = '@Circuit(name = backendB)';
const readstream = fs.createReadStream(file_path, { encoding: 'utf8' });
const writestream = fs.createWriteStream(output_path, { encoding: 'utf8' });
const rl = readline.createInterface({
input: readstream,
crlfDelay: Infinity, // 支持任意换行符(\n, \r\n)
});
let annotationAdded = false;
try {
for await (const line of rl) {
// 精确匹配:仅当本行含 "createEvent" 且不含目标注解时才注入
if (line.includes('createEvent') && !line.includes(annotation)) {
// 使用正则确保只替换第一个 createEvent,避免误改字符串字面量
const updatedLine = line.replace(/(createEvent\b)/, `$1 ${annotation}`);
writestream.write(updatedLine + '\n');
annotationAdded = true;
} else {
writestream.write(line + '\n');
}
}
// 若全文未命中任何 createEvent 行,则在文件末尾追加注解(作为兜底策略)
if (!annotationAdded) {
writestream.write(`${annotation}\n`);
}
} finally {
// 确保流被正确关闭,避免资源泄漏
readstream.destroy();
writestream.end();
}
}
// 执行函数
appendData().catch(console.error);
✅ 关键设计说明:
-
编码安全:显式指定
encoding: 'utf8',避免二进制乱码; -
正则增强:使用
\b单词边界(createEvent\b)防止匹配到createEventLog或字符串中的createEvent; -
异常防护:
try...finally确保无论成功或失败,流均被释放; -
幂等友好:多次运行不会重复添加注解(因
!line.includes(annotation)判断); - 路径隔离:输入/输出文件分离,避免原地覆盖风险。
⚠️ 注意事项:
- 此方案适用于单行方法声明(如
public void createEvent(...) {)。若createEvent跨多行(如换行后接修饰符),需升级为 AST 解析(如javacc或tree-sitter),但会显著增加复杂度; - 生产环境建议增加文件存在性校验(
fs.existsSync)和权限检查; - 如需就地修改原文件,可在写入完成后用
fs.promises.rename()替换原文件,但务必先备份。
该方案平衡了简洁性、可靠性和可维护性,是 Node.js 自动化 Java 注解注入的推荐实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











