ByteArrayOutputStream或ByteArrayInputStream是否需要手动关闭流-为什么

编程教程 (825) 2024-11-26 14:39:04

操作示例图-6d36c13a3f0b4165acdca7826f0b7cd8.png

在处理图片的时候发现ByteArrayOutputStream不需要关闭,为啥? 

原理:

ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收。所以不需要关流。

源码参考:

ByteArrayOutputStream内部是数组: 

操作示例图-5be649817e1e42c1827fd6bee626b8cb.png

对比FileOutputStream的构造

操作示例图-8255fe50e52540f8829aaf804da0a031.png

 

很明显FileOutputStream的构造方法打开了IoBridge, 
也就是说,指向内存的流可以不用关闭,指向存储卡/硬盘的流一定要关闭。

 

通过ByteArrayInputStream和ByteArrayOutputStream的源码close()方法也可以发现,调用它们的close()方法啥也不会发生。

 

操作示例图-3d5b30bead6f4620a31c3364fd5f9c9f.png

 

操作示例图-f16a4b939e4b44aaae5637caba7eb1ee.png

 

 

从上图看到,确实,这两个流操作不需要调用close也可以,内部什么实现都没有。对比下方FileOutputStream有内容:

操作示例图-f51ddb584750437ead30ab013d7ead4f.png

操作示例图-1a932e6b42b041d89df6bf1ce347dce1.png

 

 

 

 

 

 

 

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
在处理图片的时候发现ByteArrayOutputStream不需要关闭,为啥?原理:ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向...
MultipartFile.getInputStream打开的流是否需要关回答:是需要 建议使用方式public Result<String&gtl; upload(@
安卓手机扩展内存是否需要开启关于这个问题的答案还是和手机本身配置有关。当然,总的来说,近两年中配或以上绝大多数的新机内(运行内存,非存数据的存储空间)大于6G是
Nginx 限流组件limit_req limit_req作用: 限制用户(同一个ip)在给定时间内HTTP请求的数量, 流量限制主要用作安全目的, 可以防止大量请求的...
情况说明后端提供的接口返回的二进制流,且是post方法实现代码wx.request({url:'接口地址',method:'post',header:{"token":'后端接口需要的token...
1.安装ufw防火墙sudo apt-get install ufw提示:除开精简版一般云提供商LTS版本(18/22LTS)都是默认安装的。 2.查看防火墙启
使用jQuery判断元素是否在可视区域 $("#app").offset().top; offset().top表示 绝对偏移值,比如说有一个很长的页面,#ap
jdk8新特性流的使用
mysql 查看日志是否开启日志存放路径
方案一$("#dialog-modal").modal({backdrop:"static",//点击空白处不关闭对话框show:false,//按esc键盘不关闭.})方案二在弹框元素(下面以...
有时候服务器运行的好好的,突然就无法连接无法执行任何操作了,强制重启后需要通过系统日志排查系统故障的原因只有root特权程序才能正常关闭系统。因此,当系统以正常
Microsoft Edge 浏览器退出(关闭)时清楚浏览记录随着Microsoft Edge不断升级,在Windows 11上的Microsoft Edge浏览器退出时候清除浏览记录和之前的界...
登录微信支付服务商后台打开网址,扫码登录, 关联服务商小程序服务商管理后台,微信小程序发货管理关闭
该脚本主要用于检查tomcat进程是否在线,如果不在线就启动tomcat服务#!/bin/sh res=`ps -ef|grep /home/xqlee/tomcat/bin/bootstra...
​Spring Boot 或者Spring MVC 判断请求类型是否为Ajax请求具体如下:public static boolean isAjaxRequest(HttpServletRequ...