BufferedOutputStream和ByteArrayOutputStream区别

高通camera调试经验总结 修改AF对焦模式 adb shell setprop vendor.debug.camera.af.manual 2 //使能手动对焦 adb shell setprop vendor.debug.camera.af.manual 0 //使能自动对焦 阅读详情

本文转自http://z276356445t.iteye.com/blog/1955400

也有一部分是自己加上去的,以备后用。

众所周知BufferedOutputStream是一个缓冲数据输出流接口, ByteArrayOutputStream则是字节数组输出流接口. 这2个输出流都是我们经常用到的, 它们都是OutputStream的子类,而什么时候选择用它们呢, 这个就要看你运用到什么应用场景下了. 

下来先来看下源码吧. 

1.BufferedOutputStream会首先创建一个默认的容器量, capacity = 8192 = 8KB, 每次在写的时候都会去比对capacity是否还够用, 如果不够用的时候, 就flushBuffer(), 把buf中的数据写入对应的outputStream中, 然后将buf清空, 一直这样等到把内容写完. 在这过程中主要起到了一个数据缓冲的功能. 

Java代码   收藏代码
  1. public synchronized void write(byte b[], int off, int len) throws IOException {  
  2.       // 在这判断需要写的数据长度是否已经超出容器的长度了,如果超出则直接写到相应的outputStream中,并清空缓冲区  
  3.       if (len >= buf.length) {  
  4.           flushBuffer();  
  5.           out.write(b, off, len);  
  6.           return;  
  7.       }  
  8.       // 判断缓冲区剩余的容量是否还够写入当前len的内容,如果不够则清空缓冲区  
  9.       if (len > buf.length - count) {  
  10.           flushBuffer();  
  11.       }  
  12.       // 将要写的数据先放入内存中,等待数据达到了缓冲区的长度后,再写到相应的outputStream中  
  13.       System.arraycopy(b, off, buf, count, len);  
  14.       count += len;  
  15.     }  


flushBuffer () 这个方法干了些什么呢, 来看看源码  
Java代码   收藏代码
  1. private void flushBuffer() throws IOException {  
  2.        if (count > 0) {  
  3.           // 把写入内存中的数据写到构造方法里传入的OutputStream句柄里, 并把容量大小清楚  
  4.     out.write(buf, 0, count);  
  5.     count = 0;  
  6.        }  
  7.    }  


这个类最重要的就是这2个方法, 这样节省了大量的内存空间, 合理的分配内存来完成数据输出, 当你资源不是那么充沛时, 选择这个类来实现你想要的东西是不是很合适呢?  

2.普通的OutputStream, 例如ByteArrayOutputStream也会首先创建一个默认的容器量, capacity = 32 = 32b, 每次在写的时候都会去比对capacity是否还够用, 如果不够用的时候, 就重新创建buf的容量, 一直等到内容写完, 这些数据都会一直处于内存中. 
Java代码   收藏代码
  1. public synchronized void write(byte b[], int off, int len) {  
  2.       if ((off < 0) || (off > b.length) || (len < 0) ||  
  3.             ((off + len) > b.length) || ((off + len) < 0)) {  
  4.           throw new IndexOutOfBoundsException();  
  5.       } else if (len == 0) {  
  6.           return;  
  7.       }  
  8.         // 不断对自己的容量进行相加  
  9.         int newcount = count + len;  
  10.         // 如果新的容量大小已经超过了现有的大小时,则重新开辟新的内存区域来保存当前的数据  
  11.         if (newcount > buf.length) {  
  12.             buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));  
  13.         }  
  14.         System.arraycopy(b, off, buf, count, len);  
  15.         count = newcount;  
  16.     }  


注释中已经对这个类进行了详细的解释 

总结 : 当你资源不足够用时,选择BufferedOutputStream是最佳的选择, 当你选择快速完成一个作业时,可以选择ByteArrayOutputStream之类的输出流

jre9下载 jdk9 (Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】 立即下载

相关推荐

CentOS 7下Oracle 11G RAC静默安装避坑指南:从网络规划到共享存储配置全流程

本文详细介绍了在CentOS 7环境下进行Oracle 11G RAC静默安装的全流程,包括网络规划、共享存储配置和系统参数调优等关键步骤。特别针对静默安装过程中的常见问题提供了实用的避坑指南和优化建议,帮助技术人员高效完成企业级数据库部署。

weixin_29234509的博客 124

Java IO: ByteArrayOutputStream使用

感谢原文作者:小思思smile 原文链接:https://blog.youkuaiyun.com/u014049880/article/details/52329333/ 在创建ByteArrayOutputStream类实例时,内存中会创建一个byte数组类型的缓冲区,缓冲区会随着数据的不断写入而自动增长。 可使用toByteArray()和toString()获取数据。 关闭ByteArrayOutputStream无效,此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException 在网络传输中我们.

Jason的学习笔记 1721

VSCode+Pyside6开发环境配置全攻略:从安装到实战UI设计

本文提供了一份详细的VSCode与Pyside6集成开发环境配置指南。从创建Python虚拟环境、安装必备VSCode插件,到深度配置PYQT Integration插件以打通Qt Designer与代码编译,最后通过一个待办事项应用实战演示了从UI设计到业务逻辑绑定的完整工作流,旨在帮助开发者建立高效、可维护的GUI开发环境。

qq_27496129的博客 980

DataOutputStream、FileOutputStream和ByteArrayOutputStream

我们在对流操作的时候,需要注意的是,如果采用什么样的流写,必须采用对应的流读。 为了能够提高读写效率,一次性把数据写、读。我们采用DataOutputStream。 针对file的写、读,我们使用DataOutputStream装饰FileOutputStream; 针对byte的写读,我们使用DataOutputStream装饰ByteArrayOutputStream。 下面是实例代码

5114

从零开始:在Unity中使用Dynamic Bone实现角色骨骼自然抖动(以女性角色胸部为例)

本文详细介绍了在Unity中使用Dynamic Bone插件实现角色骨骼自然抖动的完整流程,特别以女性角色胸部为例。从插件导入、骨骼系统基础到Dynamic Bone组件配置和参数调优,提供了全面的技术指导。文章还包含性能优化技巧和常见问题解决方案,帮助开发者快速掌握这一物理效果实现方法。

weixin_28728495的博客 453

实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例

本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。

weixin_30482181的博客 405

Java基础程序——转换流和缓冲流

目录 一、转换流 1.1、OutputStreamWriter 1.2、InputStreamReader 1.3、转换流和子类的区别 二、字节缓冲流 2.1、字节缓冲输出流BufferedOutputStream 2.2、字节缓冲输入流BufferedInputStream 2.3、使用基本流和高效流完成复制文件 三、字符缓冲流 3.1、字符缓冲流 3.2、字符缓冲输出流:BufferedWriter 3.3、字符缓冲输入流:BufferedReader 3.4、使用字符缓冲流完

weixin_45890771的博客 2405

Android perfetto 简介

android linux 性能优化 原理及操作

求变,从思想开始 3476

对ByteArrayOutputStream和BufferedOutputStream的理解

二者的共同点是:都是为了缓存数据的输出,提高数据输出的效率; 而二者的区别是:ByteArrayOutputStream是将数据全部缓存到自身,然后一次性输出;而BufferedOutputStream是缓存一部分后,一次一次的输出。 这是我理解的二者的一个区别,当然,他们在用法上和使用领域上还有很多区别了,这里我就不多说了。 另外,使用ByteArrayOutputStream、B...

nayao-net 2802

从零构建Fama-French多因子模型:量化投资系统开发实战

本文详细介绍了如何从零构建Fama-French多因子模型,并将其应用于量化投资系统的开发。首先,文章概述了Fama-French多因子模型的背景、核心原理和架构,解释了其如何通过引入市场风险、规模、价值、盈利和投资等因子来解释股票收益率的变化。接着,文章详细阐述了构建该模型的具体步骤,包括因子的计算、因子暴露的确定以及模型的估计。通过数学模型和公式,文章对模型进行了理论推导,并举例说明了其应用。此外,文章还提供了项目实战的代码案例,从开发环境搭建到源代码实现,逐步指导读者完成量化投资系统的开发。最后,文章

2501_92132293的博客 1226

YOLO11优化:原创自研 | 低对比度场景 | 平滑的 CIoU,对其惩罚项(中心点距离和长宽比差异)进行平滑

为了应对上述挑战,我们需要一个对边界框定位误差更具容忍度的 IoU 变体。我们的核心思想是:在 CIoU 的基础上,对其惩罚项(中心点距离和长宽比差异)进行平滑处理

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 535

将文件流转换成byte[]数组

InputStream is = new FileInputStream(new File("D://a.txt")); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] bytes = new byte[1024]; int temp; while ((temp = is.read(bytes)) != -1) { outputStream.write(bytes, 0, temp); } //转.

走马川行雪的博客 7805

搞定ESD(九):静电放电之PCB设计

不同信号参考地平面应尽量保持完整,减小静电电流流过参考地平面时造成的电位差,防止电位差导致的信号传输电平错误.主芯片GPIO信号布线应保持最短化,减小与参考地平面之间的电场耦合,同时也防止因信号环路面积较大耦合静电放电噪声干扰。外部端子接地引脚顶层采用分地设计,最好是直接过孔到完整参考地平面接地,避免与顶层信号包地、其它包地相连,防止顶层串扰耦合到其它信号,造成ESD问题。

记得诚 1951

ByteArrayInputStream(ByteArrayOutputStream)和BufferedInputStream(BufferedOutputStream)的区别

PS:ByteArrayXXXputStream:指ByteArrayInputStream或者ByteArrayOutputStream BufferedXXXputStream:指BufferedInputStream或者BufferedOutputStream 两者都维护着一个byte[]类型的数组,并且也都有mark(), reset(), skip()这样的方法ByteArrayXXXp

Keep Learning , Keep Improving ! 1842

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

{java i/o}——BufferedOutputStream 与ByteArrayOutputStream比较

看了下源代码,感觉其实这两个类倒没必要比较,因为使用的最根本目的是不一样的。 BufferedOutputStream 的优势主要是针对不用缓冲区的一般输出流而言的,即较少读取到内存的次数,同时缓冲区大小固定,区满则清空,有效利用内存; ByteArrayOutputStream的write方法并没有输出到输出流,而是为了得到一个保存了所有待输出字节的byte数组:缓冲区不断扩容,直到所有

经常犯错的Zack 2941

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java源码剖析之InputStream与OutputStream(1) --- BufferedOutputStream和普通ByteArrayOutputS

[b]又是好久没写博客了, 今天也心血来潮, 把以前的笔记整理了一下, 一点点发出来.[/b] [color=brown]今天主要是想记录下BufferedOutputStream和ByteArrayOutputStream区别[/color] 众所周知BufferedOutputStream是一个缓冲数据输出流接口, ByteArrayOutputStream则是字节数组输出流接口....

没有比脚更长的路,没有比人更高的山 263

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

InputStream和OutputStream

在java.io包中提供了60多个类(流)。 (1)从功能上分为两大类:输入流和输出流。 (2)从流结构上可分为字节流和字符流。  字节流类(Byte Streams)字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图像或声音等的二进制数据。 字符流类(Character Streams)字符流类用于向字符流读写16位二进制字符。 (3)节点流:从特定的地方读写

“点点”专栏 880

[javase]IO

一、流 java流分为两种,一种字节流,另一种是字符流,分别由四个抽象类表示:InputStream, OutputStream, Reader, Writer 注:在网络程序设计中到底是使用字符流还是字节流呢? 答案:有一个简单的判断方法:如果通讯的双方都是java语言编写,最好使用字符流或更高级的流类。如果通讯的另一端是未知的,最好使用字节流,并事先约定好通讯规则发送和接收数据

胖胖的ALEX 533

安卓面试杂谈一

1、 2、System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序,如: 在一个if-else判断中,如果我们程序是按照我们预想的执行,到最后我们需要停止程序,那么我们使用System.exit(0),而System.exit(1)一般放在catch块中,当捕获到异常,需要停止程序,我们使用System.exit(1)。这个status=1是用来表...

qf361的博客 703

IO流常用类的总结

主要对常用的相关IO进行总结,如果哪里不懂仔细查看API。 可以从三个方面去看待IO流。 第一个从处理数据的类型去看可分为:字节流,字符流,转换流。 第二是从流向去看分为:输出和输入流 ...

MADE_哒哒 514

java IO的学习总结

1、JAVA中的IO流分字节流和字符流 2、InputStream/OutputStream是字节流的接口 3、Reader/Writer是字符流的接口 4、字节流InputStream/OutputStream的子类 a)BufferedInputStream/BufferedOutputStream以InputStream/OutputStream对象做为参数构造一个流缓冲区 b...

145

JAVA基础之IO流

今天我们学习了一下IO流的其他重要的流; 输入输出字节流 DataInputStream和DataOutputStream 定义:这是一对针对字节得数据输入输出流,他的特点是能够读写基本数据类型;数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。 private static void writerData() throws IOException { ...

Hackpatrick的博客 237

ByteArrayInputStream的作用,和BufferedOutputStream 的区别

个人好奇ByteArrayInputStream,到底是有什么用于是百度了一些资料 整合了下,********这两个类对于要创建临时性文件的程序以及网络数据的传输、数据压缩后的传输等可以提高运行的的效率,可以不用访问磁盘。同样有StringReader与StringWriter类以字符IO流的方式处理字符串。流的来源或目的地并不一定是文件,也可以是内存中的一块空间,例如一个字节数组。ja...

weixin_30544657的博客 471

bytearrayoutputstream dataoutputstream分析

DataOutputStream 类与BufferedOutputStream类的区别是什么: BufferedOutputStream类能够在内存里建立一个缓冲区,当写文件的时候,能起到缓冲的作用.但是DataOutputStream能像BufferedOutputStream类一样起到缓冲作用吗?如果有缓冲作用的话,但是DataOutputStream 类的构造函数里,只有一个.而且其构

zhaozhe 826
上一篇: spring声明事务管理之细节session.getCurrentSession()
下一篇: Struts2零配置
fmwind
博客等级 码龄24年 147粉丝 108原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值