OutputStreamWriter 不提供设置换行符的方法,换行符由写入的字符串决定,如 "\n"、"\r\n" 或 println() 使用的 System.lineSeparator();跨平台统一需显式拼接 "\n" 或封装常量。

OutputStreamWriter 本身不提供直接设置换行符(LineSeparator)的方法,它只是将字符流转换为字节流,并依赖底层 OutputStream 和所选字符编码进行写入。换行符由你写入的内容决定,而不是由 OutputStreamWriter 自动添加或替换。
换行符由写入的字符串决定
Java 中换行符是普通字符,比如 "\n"(LF)、"\r\n"(CRLF)或 "\r"(CR)。你调用 write() 或 println() 时,实际写入什么,就输出什么:
-
out.write("Hello\nWorld");→ 输出 LF 换行 -
out.write("Hello\r\nWorld");→ 输出 CRLF 换行 -
out.println("Hello");→ 使用系统默认换行符(System.lineSeparator())
用 System.lineSeparator() 控制统一换行符
如果希望跨平台保持一致(比如强制用 "\n" 而非 Windows 默认的 "\r\n"),不要依赖 println(),而是显式拼接:
- 写入时手动加
"\n":out.write("line1\nline2\n"); - 或用常量封装:
private static final String NL = "\n"; - 避免用
System.lineSeparator()如果目标不是“适配当前系统”,而是“固定格式”
包装成 BufferedWriter 可简化操作
虽然 OutputStreamWriter 不管理换行,但配合 BufferedWriter 后,newLine() 方法可按需控制(但仍取决于你如何实现它):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));-
bw.write("line1"); bw.newLine();→ 实际调用的是System.lineSeparator() - 如需自定义,可继承
BufferedWriter并重写newLine(),或直接写bw.write("\n")
真正生效的位置在数据生成阶段
换行符最终由你的业务逻辑决定,例如:
- 生成 CSV、JSON 或日志时,显式指定分隔符和换行符
- 使用模板引擎(如 StringTemplate、Freemarker)时,在模板里写
\n或配置输出格式 - 若对接外部协议(如 HTTP、SMTP),必须严格按协议要求写
\r\n
不复杂但容易忽略:换行符是内容的一部分,不是编码或流的属性。想改换行符,改的是你往流里写的字符串,不是 OutputStreamWriter 的配置。

















