OutputStream是Java字节输出流抽象基类,核心作用是将字节数据写入目标;它需与Socket或HttpURLConnection等网络连接关联,通过write()写入、flush()强制发送、close()释放资源,本身不处理建连与协议。

Java 中使用 OutputStream 发送网络字节数据,核心是把它和网络连接(如 Socket 或 HTTP 连接)关联起来,然后调用 write() 方法写入字节。它本身不负责建连或协议处理,只是“管道出口”。
通过 Socket 获取 OutputStream 发送原始字节
这是最直接的方式,适用于自定义 TCP 协议、简单服务通信等场景:
- 创建
Socket连接到目标 IP 和端口 - 调用
socket.getOutputStream()获取输出流 - 用
write(byte[])、write(int)或包装成DataOutputStream写数据 - 记得调用
flush()确保数据发出(尤其未满缓冲区时) - 操作完成后关闭流或 socket(推荐关 socket,会自动关流)
示例:
Socket socket = new Socket("example.com", 8080);
OutputStream out = socket.getOutputStream();
out.write("HELLO".getBytes(StandardCharsets.UTF_8));
out.flush(); // 强制发送
socket.close();
通过 HttpURLConnection 发送 HTTP 请求体
当需要发 POST/PUT 等带请求体的 HTTP 请求时,需启用输出并获取 OutputStream:
立即学习“Java免费学习笔记(深入)”;
- 创建
HttpURLConnection,设置setDoOutput(true) - 调用
getOutputStream()(此时连接已隐式建立) - 写入字节数据(如 JSON、表单、二进制文件等)
- 注意:必须提前设置
Content-Length或使用分块传输(setChunkedStreamingMode),否则可能阻塞
示例(发送 JSON):
URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
conn.setFixedLengthStreamingMode(jsonBytes.length);
try (OutputStream out = conn.getOutputStream()) {
out.write(jsonBytes);
}
配合 BufferedOutputStream 提升小数据写入效率
频繁调用 write(int) 或小字节数组时,直接写网络流开销大。可用 BufferedOutputStream 缓冲后再批量发出:
- 包装原始网络
OutputStream:new BufferedOutputStream(out) - 写入仍用
write(),但实际在内存缓冲,直到缓冲区满或调用flush() - 注意:必须显式
flush()才能确保数据到达对端(关闭流也会 flush,但显式更可控)
注意事项与常见问题
使用过程中容易踩坑的地方:
-
字符编码要明确:用
String.getBytes(Charset)替代默认getBytes(),避免平台差异 -
不要重复 close 流:若包装了多层(如
BufferedOutputStream→Socket.getOutputStream()),只关最外层即可 -
HTTP 场景下别漏设请求头:比如
Content-Type、Content-Length或启用 chunked - 异常时流可能未关闭:建议用 try-with-resources(JDK 7+)自动管理


















