java源码-BufferedWriter
开篇
BufferedWriter和BufferedReader是对称的,一并分析下源码。
源码分析
构造函数
- BufferedWriter的构造函数通过缓冲区char cb[]数组保存待持久化字符
- 缓存区默认大小为8192
- BufferedWriter跟BufferedReader一样采用装饰者模式进行设计,通过内部Writer out对象保存被装饰的Writer对象。
- BufferedWriter的写操作通过被装饰的out对象进行数据写入。
public class BufferedWriter extends Writer { private Writer out; private char cb[]; private int nChars, nextChar; private static int defaultCharBufferSize = 8192; private String lineSeparator; public BufferedWriter(Writer out) { this(out, defaultCharBufferSize); } public BufferedWriter(Writer out, int sz) { super(out); if (sz <= 0) throw new IllegalArgumentException("Buffer size <= 0"); this.out = out; cb = new char[sz]; nChars = sz; nextChar = 0; lineSeparator = java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("line.separator")); }
write过程
- write过程先把数据写到缓冲区cb数组当中
- 当缓冲区cb数组当中的字符超出最大缓存区大小,那么就执行flush保存数据
public void write(int c) throws IOException { synchronized (lock) { ensureOpen(); // 超出缓存区大小就执行flush操作 if (nextChar >= nChars) flushBuffer(); cb[nextChar++] = (char) c; } } void flushBuffer() throws IOException { synchronized (lock) { ensureOpen(); if (nextChar == 0) return; // 将数据通过out对象进行持久化 out.write(cb, 0, nextChar); // 重置缓冲区的起始位置 nextChar = 0; } } }
类依赖图
- BufferedWriter的类依赖图如下图,所有的io writer都是继承自Writer作为基类。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
关于C++、PHP和Swoole
昨天和一个前同事聊天,各种吐槽PHP,吐槽Swoole,他认为PHP到处是坑,PHP局限很大。PHP+Swoole不适合做高并发服务器,C+Swoole才是最好的方案。C++有各种数据结构,C++可以开线程,C++可以共享对象。看来有必要好好得说明一下了。 PHP比C/C++或Java少了什么?多线程,多线程,多线程…… 是的。PHP比C/C++、Java少了多了多线程。PHP只有多进程的方案,所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限? 多线程看似比多进程要强大很多,实际上我可以负责任的告诉你,多线程带来的坑更多。 数据同步问题会让你崩溃的。要么就牺牲性能到处加锁,要么就用地狱难度的无锁并发编程,据我所知目前国内能掌握此项技能的人凤毛麟角。 不要以为加锁就万事大吉了,你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后,锁越来越难控制了,一旦死锁你的程序基本上就完了。 某个线程挂了那所有线程都会退出 反而在看多进程,其实就简单的多了。 配合进程间通信,基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构...
- 下一篇
MyBatis-Plus | 最简单的查询操作教程(Lambda)
引言 上一篇:MyBatis-Plus | 最优雅最简洁地完成数据库操作 是对MyBatis-Plus的功能进行简单介绍,虽然是介绍,也让我们领略到他的优雅与强大。你是不是已经被吸引了?别着急,上一节,我们算是参观了MyBatis的风景,这一节,我将带你领略他独特的魅力。 Lambda 官方表示,3.x支持Lambda表达式,那应该怎么使用呢?我们来看个例子: QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(Student::getName, "冯文议"); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(student); 看一下测试结果(为了看好,我们转成json): { "id":1035789714459471874, "name":"冯文议", "age":26, "info":...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Linux系统CentOS6、CentOS7手动修改IP地址