PrintWriter是Java中向Socket输出流写入格式化字符串最简洁常用的方式,封装OutputStream自动处理编码、缓冲和换行符;需显式指定UTF-8编码、启用自动刷新,并用try-with-resources确保资源正确释放。

在 Java 中,PrintWriter 是向 Socket 输出流写入格式化字符串(尤其是带换行符的文本)最简洁、最常用的方式之一。它封装了底层 OutputStream,自动处理字符编码、缓冲和换行符适配,避免手动调用 write() + flush() + new String().getBytes() 等繁琐操作。
使用 PrintWriter 包装 Socket 的 OutputStream
创建 PrintWriter 时,需传入 socket.getOutputStream(),并建议启用自动刷新(true 参数),这样每次调用 println() 或 printf() 后会自动刷新缓冲区,确保数据及时发出:
示例:
Socket socket = new Socket("localhost", 8080);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 自动刷新开启
out.println("Hello, Server!"); // 自动换行 + 自动刷新
out.printf("Time: %d ms%n", System.currentTimeMillis()); // %n 使用平台换行符
正确处理换行符与平台兼容性
PrintWriter 的 println() 和 %n 格式符会使用当前 JVM 平台的默认换行符(如 Linux 是 \n,Windows 是 \r\n)。若通信协议要求固定换行符(例如 HTTP 或自定义协议强制用 \r\n),不能依赖 println(),而应:
- 关闭自动刷新,改用
print()+ 显式写入"\r\n"+ 手动flush() - 或直接用
BufferedWriter配合socket.getOutputStream(),更精细控制
注意字符编码与异常处理
PrintWriter 默认使用平台默认编码,易在跨平台通信中出错。推荐显式指定编码:
安全写法:
OutputStream os = socket.getOutputStream();
PrintWriter out = new PrintWriter(
new OutputStreamWriter(os, StandardCharsets.UTF_8),
true // auto-flush
);
同时务必捕获 IOException(如连接断开、对方关闭读端),并在 finally 块中关闭资源(或使用 try-with-resources):
try (Socket socket = new Socket("localhost", 8080);
PrintWriter out = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8), true)) {
out.println("READY");
} catch (IOException e) {
e.printStackTrace();
}
避免常见陷阱
-
不要混合使用
PrintWriter和原始OutputStream:一旦用PrintWriter包装了输出流,不要再直接操作该OutputStream,否则可能造成缓冲冲突或数据错乱 -
关闭顺序很重要:关闭
PrintWriter会自动关闭底层Socket的输出流;但不关闭PrintWriter而只关Socket,会导致未刷新数据丢失 -
慎用
checkError():它仅检测底层流是否发生过错误,且不抛异常,适合轮询检查,但不能替代异常处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











