java.io.BufferedOutputStream 源码分析
2024-10-15 16:00:43
BufferedOutputStream 是一个带缓冲区的输出流,通过设置这种输出流,应用程序就可以字节写入到缓冲区中,当缓冲区满了以后再调用底层系统,而不必针对每次字节写入调用底层系统,从而提高系统性能。
俩个成员变量,buf是存储字节数据的内部缓冲区,count是缓冲区中的有效字节数。
protected byte buf[];
protected int count;
构造参数可以指定缓冲区的大小,可以使用默认值8192,也可以自定义大小。
public BufferedOutputStream(OutputStream out) {
this(out, 8192);
}
public BufferedOutputStream(OutputStream out, int size) {
super(out);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
刷新缓冲区数据到底层输出流。
private void flushBuffer() throws IOException {
if (count > 0) {
out.write(buf, 0, count);
count = 0;
}
}
输出一个字节。
public synchronized void write(int b) throws IOException {
//判断缓冲区buf是否已满,满了就调用底层流将数据写进去。
if (count >= buf.length) {
flushBuffer();
}
//将字节放入到缓冲区中
buf[count++] = (byte)b;
}
输出多个字节,
public synchronized void write(byte b[], int off, int len) throws IOException {
//判断输出字节的大小,如果大于缓存区的大小,说明缓冲区装不下,那么刷新缓冲区,并将字节数据直接输出到底层流。
if (len >= buf.length) {
flushBuffer();
out.write(b, off, len);
return;
}
//如果缓冲区剩余空间不够,那么刷新缓冲区
if (len > buf.length - count) {
flushBuffer();
}
//将输出字节写入到缓冲区当buf中
System.arraycopy(b, off, buf, count, len);
count += len;
}
刷新输出流,将缓冲区的字节输出到底层流当中,同时刷新底层流。
public synchronized void flush() throws IOException {
flushBuffer();
out.flush();
}
最新文章
- <;<;<; Java提取网页源码
- MySQL数据库8 -子查询,联合查询
- 源码分析:Java对象的内存分配
- 使用了Windows Live Writer 写的博客
- 通用数据链接(UDL)的用法
- 在Oracle 11g r2中,EXP无法导出个别空的表
- STL之Pairs
- sql 针对拼接语句的优化
- ionic常用命令记录
- SQL查询每个部门工资前三名的员工信息
- jstl 处理字符串
- Java中的最值
- 用CSS指定外部链接的样式
- Java单例模式的实现
- polyfillJS生成promise对象
- mongodb 创建更新语法
- window.print打印方法实现
- JS调用百度地图API标记地点
- vue 子组件把数据传递给父组件
- Basic4android v3.00 发布
热门文章
- jota-time 练习
- hbase ERROR: wrong number of arguments (3 for 4)
- Nginx(七):keepalived实现Nginx负载均衡服务器的双机高可用
- Traefik Kubernetes 初试
- 不要随便使用 runAllManagedModulesForAllRequests=";true"; 来解决问题
- scp拷贝文件
- mybatis 多数据源
- mysql定时执行某任务
- cocos2d-x---CCLabelTTF加载字体库
- CCObject