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

关于在使用getOutputStream()方法后续没有用到write()

对于初学者来说 对于response.getOutputStream()方法时没有用到write()方法写入到浏览器经常存在疑惑。根据下面例子分析。

 public void download(HttpServletResponse response, String filePath) {try {//使用 MinIO 客户端 (minioClient) 从指定的桶 (getBucket()) 和文件路径 (filePath) 中获取文件流。//minioClient.getObject(...) 本身就返回的是 InputStreamInputStream fileInputStream = minioClient.getObject(minIOConfigProperties.getBucket(), filePath);//todo 这里下载的文件名为filePath,包含了文件夹路径,下载可能会存在问题,需要处理文件名问题 建议只保留文件名response.setHeader("Content-Disposition", "attachment;filename=" + filePath);response.setContentType("application/force-download");// MIME 类型为强制下载response.setCharacterEncoding("UTF-8");//把从 MinIO 获取到的文件流内容,写入到响应输出流中,返回给浏览器下载。IOUtils.copy(fileInputStream, response.getOutputStream());//把 fileInputStream(MinIO 中获取到的文件内容)写入到 response.getOutputStream()(HTTP 响应流),从而实现文件下载。} catch (Exception e) {System.out.println("下载失败");}}

在这段代码中似乎没有用到 response.wirte(),那么它是如何将输出流写入浏览器的呢?

关键在于IOUtils.copy(fileInputStream, response.getOutputStream());】

✅ 实际上:write()IOUtils.copy() 内部调用了!

这句代码使用的是 Apache Commons IO 工具库中的方法,核心逻辑是这样的(简化伪代码):

public static long copy(InputStream input, OutputStream output) throws IOException {byte[] buffer = new byte[4096];int n;while ((n = input.read(buffer)) != -1) {output.write(buffer, 0, n); // ✅ 实际是用 write() 写的}return count;
}

也就是说,IOUtils.copy() 在内部就是不停地调用:

  • input.read(buffer)InputStream 读数据

  • output.write(buffer, 0, n) 写入到 OutputStream(也就是浏览器的响应流)

🔍 为什么我们没看到 write()

你只是没自己手动写而已。你把这项工作交给了 IOUtils.copy() —— 它就是个帮你自动用 write() 搬运流数据的工具方法


✅ 使用 IOUtils.copy() 的好处:

优点说明
简洁只需一行代码,省去了 read-write 循环
安全避免忘记写偏移量、错误处理等低级 bug
效率默认使用缓冲区(4KB),性能不错
可维护更少代码,更易读

相关文章:

  • 【大模型面试每日一题】Day 15:流水线并行的Bubble问题及其缓解方法
  • Python训练营打卡DAY22
  • FramePack AI图片生成视频 v1.1 整合包
  • Vue.js 全局导航守卫:深度解析与应用
  • 2024睿抗编程赛国赛-题解
  • Python-Venv多环境管理
  • 拓扑学在天体物理学的应用:python 示例
  • 模块自动导入的小工具
  • c++类【终章】
  • 2023 河南ccpc
  • Python学习之路(玖)-图像识别的实现
  • TypeScript 类型保护详解
  • Beta分布--贝叶斯建模概率或比例常用分布
  • 游戏逆向开发全阶段电子资料分享 – 从入门到精通实战教程
  • C语言和Python在负数取余运算(%)上的差异
  • AUTOSAR图解==>AUTOSAR_TR_InteractionWithBehavioralModels
  • C++基本知识 —— 缺省参数·函数重载·引用
  • 2025年PMP 学习八 -第6章 项目进度管理
  • 方案精读:华为与中软-智慧园区解决方案技术主打胶片【附全文阅读】
  • 张量并行优质博客
  • 最高降价三成,苹果中国iPhone开启大促销,能拉动多少销量?
  • 科普|“小”耳洞也会引发“大”疙瘩,如何治疗和预防?
  • 中国科考船在钓鱼岛附近活动,外交部:完全是中国主权权利范围内的事
  • 女高音吴睿睿“古词新唱”,穿着汉服唱唐诗宋词
  • 香港将展“天方奇毯”,从地毯珍品看伊斯兰艺术
  • 1156万+1170万,静安、宝山购彩者击中大乐透头奖