当前位置: 首页 > backend >正文

细说getOutputStream()方法

getOutputStream() 是 Java Servlet API 中 HttpServletResponse 接口提供的方法。

返回一个用于向客户端(浏览器)发送二进制数据的输出流。

你可以通过这个输出流,直接将数据写入 HTTP 响应体中,比如:

  • 文件(二进制)

  • 图片、音频、视频

  • Excel、PDF、Word 等

🧱 工作原理(简化)

  1. 浏览器发送请求到服务器。

  2. 后端控制器中,调用 response.getOutputStream()

  3. 获取到一个 ServletOutputStream 实例。

  4. 开始写数据 outputStream.write(...)

  5. 当请求处理完成,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),避免一次性加载大文件进入内存。

 

http://www.xdnf.cn/news/5544.html

相关文章:

  • 代码随想录笔记---回溯篇
  • libcurl简单使用
  • SpringBoot 整合 Langchain4j 构建AI智能体应用
  • 《异常链机制详解:如何优雅地传递Java中的错误信息?》
  • 【RP2350】香瓜树莓派RP2350之USB虚拟串口
  • windows下安装python软件
  • Linux计划任务与进程
  • 【RP2350】香瓜树莓派RP2350之LED
  • 数字孪生概念
  • 本机的驱动
  • RoPE(旋转位置编码,参考:DeepSeek-V2)
  • Linux进程9-无名管道:1.概述、创建、读写数据、2.进程间通信、3.读写规律、4.fcntl设置阻塞、5.文件描述符概述及复制函数dup,dup2
  • Robot之VideoMimic:《Visual Imitation Enables Contextual Humanoid Control》翻译与解读
  • 安卓系统APP:志愿填报(基于Android平台的志愿填报程序)
  • LVGL环形加载器
  • Linux开机后启动Oracle数据库
  • redis数据结构-06(LRANGE、LINDEX、LSET、LREM)
  • 数字化工厂中央控制室驾驶舱系统架构文档
  • Transformer LLM
  • Linux数据库篇、第零章_MySQL30周年庆典活动
  • 关于chatshare.xyz激活码使用说明和渠道指南!
  • 3D虚拟工厂vue3+three.js
  • Babel 深度解析:现代 JavaScript 开发的桥梁
  • @RequestParam @RequestHeader @RequestBody 三者详解
  • 【英语笔记(四)】诠释所有16种英语时态,介绍每种时态下的动词变形!!含有所有时态的的动词变形汇总表格
  • C语言学习记录——深入理解指针(4)
  • 单片机-STM32部分:13、PWM
  • MongoDB
  • wget、curl 命令使用场景与命令实践
  • 数据并行基础概念知识