细说getOutputStream()方法
getOutputStream() 是 Java Servlet API 中 HttpServletResponse 接口提供的方法。
返回一个用于向客户端(浏览器)发送二进制数据的输出流。
你可以通过这个输出流,直接将数据写入 HTTP 响应体中,比如:
-  文件(二进制) 
-  图片、音频、视频 
-  Excel、PDF、Word 等 
🧱 工作原理(简化)
-  浏览器发送请求到服务器。 
-  后端控制器中,调用 response.getOutputStream()。
-  获取到一个 ServletOutputStream实例。
-  开始写数据 outputStream.write(...)。
-  当请求处理完成,Web 容器(如 Tomcat)会将写入的数据返回给客户端。 
🧪 示例代码
示例 1:返回一段二进制数据
@GetMapping("/raw")
public void rawBinary(HttpServletResponse response) throws IOException {byte[] data = {1, 2, 3, 4, 5};response.setContentType("application/octet-stream");ServletOutputStream out = response.getOutputStream();out.write(data);out.flush();
}
示例 2:文件下载
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=\"file.txt\"");try (ServletOutputStream out = response.getOutputStream()) {out.write("这是一个下载文件的内容".getBytes(StandardCharsets.UTF_8));out.flush();}
}
⚠️ 注意事项
| 注意点 | 说明 | 
|---|---|
| 字符流冲突 | getWriter()和getOutputStream()只能调用一个,不能混用。调用一个后再调用另一个会抛出IllegalStateException。 | 
| 设置类型 | 调用前要设置 Content-Type,否则浏览器可能无法正确识别数据类型。 | 
| 刷新流 | 使用 flush()强制写出缓存区的数据;确保及时发送数据。 | 
| 关闭流 | 通常交给 Servlet 容器关闭,但在 try-with-resources中用out.close()更保险。 | 
| 大文件下载优化 | 使用缓冲区分块写入(如 4KB),避免一次性加载大文件进入内存。 | 
