Java中生成Patch文件时换行符必须为Unix风格“\n”且编码为UTF-8(无BOM),需显式指定而非依赖System.lineSeparator()或字符串"UTF-8",并确保头信息与原文件换行及编码一致。

在 Java 中用 BufferedWriter 生成 Patch 补丁文件时,换行和编码必须严格匹配目标系统规范,否则 patch 工具(如 git apply 或 patch)可能解析失败。
换行符必须统一为 Unix 风格(\n)
Patch 文件是纯文本格式,RFC 和 GNU patch 工具默认只识别 \n 作为行结束符。Windows 的 \r\n 或 Mac 的 \r 会导致“invalid format”错误。
- 不要依赖
System.lineSeparator()—— 它会随运行环境变化 - 写入时显式使用
"\n",例如:writer.write("@@ -1,3 +1,4 @@\n"); - 调用
writer.newLine()前先重置其行为:构造BufferedWriter时不传入自动换行的PrintWriter,而用底层OutputStreamWriter配合固定换行
编码必须设为 UTF-8(无 BOM)
绝大多数 patch 工具(包括 git)假设补丁内容为 ASCII 兼容编码,UTF-8 是安全且通用的选择;但带 BOM 的 UTF-8 会被视为非法起始字符,导致解析中断。
- 创建
BufferedWriter时明确指定StandardCharsets.UTF_8 - 避免使用
"UTF-8"字符串,防止 JVM 默认 charset 干扰(尤其在 Windows 上) - 示例写法:
new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(path), StandardCharsets.UTF_8))
写入前校验原始文件的换行与编码
Patch 文件中的 --- /dev/null、+++ b/file.java 等头信息及 diff 内容,需与被修改文件的实际换行符和编码一致,否则上下文行匹配失败。
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
立即学习“Java免费学习笔记(深入)”;
- 读取原文件时也用
StandardCharsets.UTF_8和手动处理\n - 逐行比对差异时,统一按
\n切割,并保留原始行末不带\r - 若原文件含 CRLF,diff 输出中应仍为 LF(patch 工具内部转换),所以生成 patch 时所有内容一律用
\n
推荐封装一个 PatchWriter 工具类
避免每次手动处理细节,可封装一个专用于 patch 输出的 writer:
- 构造时强制绑定
UTF-8编码 + 固定\n换行 - 提供
writeHeader()、writeHunk()等语义方法,内部统一调用write(... + "\n") - 关闭前确保 flush,防止缓冲区残留未写入内容(patch 文件必须完整)








