bufferedreader 逐行读取 git diff 文件,需结合字符串解析识别 +(添加)、-(删除)、空格(上下文)三类变更行,跳过元信息行;通过状态机跟踪文件路径和 hunk 行号,按文件分组存储,并指定 utf-8 编码以确保正确性。

处理 Git Diff 文件时,BufferedReader 本身不直接“提取变更行”,它只是逐行读取文本。真正识别变更行(如 +xxx、-xxx、带 @@ 的 hunk 头)需要结合字符串解析逻辑。关键在于理解 diff 格式结构,并在读取过程中按规则过滤和分类。
识别标准 diff 行类型
Git diff 输出中,有意义的变更行有三类:
-
添加行:以
+开头(不含+++文件头) -
删除行:以
-开头(不含---文件头) - 上下文行:以空格开头,属于变更块中的未修改行(常用于定位)
注意跳过元信息行(如 diff --git、index、--- a/xxx、+++ b/xxx、@@ -1,3 +1,4 @@),它们不表示内容变更。
用 BufferedReader 逐行判断并收集
不需要预加载全部内容,边读边判断更省内存。示例逻辑:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("+") && !line.startsWith("+++")) {
// 添加行,去掉 '+' 后的内容即新增代码
addedLines.add(line.substring(1));
} else if (line.startsWith("-") && !line.startsWith("---")) {
// 删除行,去掉 '-' 后的内容即被删代码
removedLines.add(line.substring(1));
}
// 忽略其他行(hunk 头、文件头、空行等)
}
若需保留行号或所属文件,可配合状态机跟踪当前文件名和 hunk 起始位置(解析 @@ 行获取起始行号)。
处理多文件 diff 时保持上下文
一个 diff 可能包含多个文件变更。靠识别 diff --git 或 --- a/xxx 行来切换当前文件:
- 遇到
--- a/xxx时提取路径(如a/src/Main.java→src/Main.java) - 后续的
+/-行归属该文件,直到下一个diff或---出现 - 用
Map<string list>></string>按文件路径分组存储变更行
注意空格与编码细节
Git diff 默认使用 UTF-8,确保 BufferedReader 构造时指定编码:
new BufferedReader(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))
另外,某些 diff 行末尾可能含空格(尤其当删除/添加空行时),line.trim() 会误判,建议只对前缀做 startsWith 判断,保留原始空白。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










