OutputStreamWriter 不提供 line separator 配置,换行符由手动写入或 BufferedWriter.newLine() 决定;推荐用 BufferedWriter 包装并调用 newLine() 实现跨平台兼容,或显式写入 \n 以统一格式。

OutputStreamWriter 本身不提供直接配置 line separator 的方法,它只是将字符流转换为字节流,并依赖底层 OutputStream 和所选字符编码进行写入。换行符(line separator)的处理实际上由你**手动写入的字符串**或**配套的 Writer(如 BufferedWriter)决定**,而非 OutputStreamWriter 自身控制。
1. 换行符由写入内容决定,不是 OutputStreamWriter 配置项
OutputStreamWriter 没有 setLineSeparator() 或类似 API。它只负责按指定编码(如 UTF-8)把 char 写成 byte。真正的换行符号(\n、\r\n、\r)必须由你显式写入,或通过更高层的封装类自动插入。
- 直接用
out.write("\r\n")就写 Windows 风格换行 - 写
"\n"是 Unix/Linux/macOS 默认风格 - 写
System.lineSeparator()可适配当前 JVM 运行平台
2. 推荐方式:配合 BufferedWriter 使用 lineSeparator()
最常用且可移植的做法是包装 OutputStreamWriter 为 BufferedWriter,再用 newLine() 方法 —— 它内部自动调用 System.lineSeparator():
OutputStream os = new FileOutputStream("file.txt");
OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("第一行");
bw.newLine(); // ← 自动写入当前平台的换行符(如 \r\n 或 \n)
bw.write("第二行");
bw.close();
这样无需硬编码换行符,也避免了跨平台问题。
立即学习“Java免费学习笔记(深入)”;
3. 如需强制指定换行符(如统一用 \n),就手动写
如果项目明确要求所有平台都用 LF(\n),比如生成 HTTP 响应、JSON、Unix 脚本等,直接写字符串即可:
bw.write("hello"); bw.write("\n");- 或封装工具方法:
bw.write("hello" + "\n"); - 避免用
System.lineSeparator()或bw.newLine(),它们会随 JVM 平台变化
4. 注意:文件写入后换行符不可逆,查看需匹配编辑器设置
写入的换行符最终保存在文件中。Windows 记事本只能识别 \r\n,若写入纯 \n 会显示为一行;而 VS Code、Notepad++ 等现代编辑器能自动识别各种换行格式。调试时可用 hex 工具确认实际字节:0A 是 \n,0D 0A 是 \r\n。
不复杂但容易忽略


















