作者:empty 页数:225 出版社:empty |
Java lO是一个庞大的知识体系, 很多人学着学着就会学懵了, 包括我在内也是如此, 所以本文将会从Java的BIO开始, 一步一步深入学习, 引出JDK 1.4之后出现的NIO技术, 对比NIO与BIO的区别, 然后对NIO中重要的三个组成部分进行讲解(缓冲区、通道、选择器) , 最后实现一个简易的客户端与服务器通信功能。
Java lO流是一个庞大的生态环境, 其内部提供了很多不同的输入流和输出流, 细分下去还有字节流和字符流,甚至还有缓冲流提高IO性能,转换流将字节流转换为字符流……看到这些就已经对IO产生恐惧了, 在日常开发中少不了对文件的IO操作, 虽然apache已经提供了Commons IO这种封装好的组件, 但面对特殊场景时, 我们仍需要自己去封装一个高性能的文件IO工具类, 本文将会解析JavaIO中涉及到的各个类,以及讲解如何正确、高效地使用它们,BIO NIO和AIO的区别我们会以一个经典的烧开水的例子通俗地讲解它们之间的区别类型烧开水BIO一直监测着某个水壶,该水壶烧开水后再监测下一个水壶NIO每隔一段时间就看看所有水壶的状态,哪个水壶烧开水就去处理哪个水壶AIO不用监测水壶,每个水壶烧开水后都会主动通知线程说:“我的水烧开了,来处理我吧 BIO(同步阻塞I/O)这里假设一个烧开水的场景, 有一排水壶在烧开水, BIO的工作模式就是, 小菠萝一直看着着这个水壶,直到这个水壶烧开,才去处理下一个水壶。线程在等待水壶烧开的时间段什么都没有做。NIO(同步非阻塞I/O)还拿烧开水来说, NIO的做法是小菠萝一边玩着手机, 每隔一段时间就看一看每个水壶的状态, 看看是否有水壶的状态发生了改变,如果某个水壶烧开了,可以先处理那个水壶,然后继续玩手机,继续隔一段时间又看看每个水壶的状态。AIO(异步非阻塞I/O)小菠萝觉得每隔一段时间就去看一看水壶太费劲了,于是购买了一批烧开水时可以哔哔响的水壶,于是开始烧水后,小菠萝就直接去客厅玩手机了,水烧开时,就发出 哔哔 的响声,通知小菠萝来关掉水壶。什么是流知识科普:我们知道任何一个文件都是以二进制形式存在于设备中,计算机就只有0和1,你能看见的东西全部都是由这两个数字组成,你看这篇文章时,这篇文章也是由01组成,只不过这些二进制串经过各种转换演变成一个个文字、一张张图片跃然屏幕上而流就是将这些二进制串在各种设备之间进行传输,如果你觉得有些抽象,我举个例子就会好理解一些:下图是一张图片,它由01串组成,我们可以通过程序把一张图片拷贝到一个文件夹中,把图片转化成二进制数据集,把数据一点一点地传递到文件夹中,类似于水的流动,这样整体的数据就是一个数据流IO流读写数据的特点:·顺序读写。读写数据时,大部分情况下都是按照顺序读写,读取时从文件开头的第一个字节到最硬盘后一个字节, 写出时也是也如此(RandomAccessFile可以实现随机读写)
·字节数组。读写数据时本质上都是对字节数组做读取和写出操作,即使是字符流,也是在字节流基础上转化为一个个字符,所以字节数组是IO流读写数据的本质。流的分类根据数据流向不同分类:输入流和输出流·输入流:从磁盘或者其它设备中将数据输入到进程中·输出流:将进程中的数据输出到磁盘或其它设备上保存图示中的硬盘只是其中一种设备,还有非常多的设备都可以应用在IO流中,例如:打印机、硬盘、显示器、手机--…根据处理数据的基本单位不同分类:字节流和字符流·字节流:以字节(8bit) 为单位做数据的传输·字符流:以字符为单位(1字符=2字节)做数据的传输字符流的本质也是通过字节流读取, Java中的字符采用Unicode标准, 在读取和输出的过程中,通过以字符为单位,查找对应的码表将字节转换为对应的字符。面对字节流和字符流,很多读者都有疑惑:什么时候需要用字节流,什么时候又要用字符流?我这里做一个简单的概括,你可以按照这个标准去使用:字符流只针对字符数据进行传输,所以如果是文本数据,优先采用字符流传输;除此之外,其它类型的数据(图片、音频等),最好还是以字节流传输。根据这两种不同的分类,我们就可以做出下面这个表格,里面包含了IO中最核心的4个顶层抽象类:现在看IO是不是有一些思路了,不会觉得很混乱了,我们来看这四个类下的所有成员。[来自于c xuan的《Java基础核心总结》]看到这么多的类是不是又开始觉得混乱了,不要慌,字节流和字符流下的输入流和输出流大部分都是一一对应的,有了上面的表格支撑,我们不需要再担心看见某个类会懵逼的情况了。看到Stream就知道是字节流, 看到Re oder/Writer就知道是字符流。这里还要颜外补充一点:Java lO提供了字节流转换为字符流的转换类, 称为转换流。注意字节流与字符流之间的转换是有严格定义的:为什么在输入流不能字符流=>字节流,输出流不能字节流=>字符流?在存储设备上,所有数据都是以字节为单位存储的,所以输入到内存时必定是以字节为单位输入,输出到存储设备时必须是以字节为单位输出,字节流才是计算机最根本的存储方式,而字符流是在字节流的基础上对数据进行转换,输出字符,但每个字符依旧是以字节为单位存储的。在这里需要额外插入一个小节讲解节点流和处理流。·节点流:节点流是真正传输数据的流对象,用于向特定的一个地方(节点)读写数据,称为节点·处理流:处理流是对节点流的封装,使用外层的处理流读写数据,本质上是利用节点流的功能,
反射的基本使用
获取类的Class对象
构造类的实例化对象
JDK Proxy
C GLIB
JDK Proxy和C GLIB的对比
Spr ngA OP
实例变的特点
静态变量的特点
获取一个类的所有信息
获取类中的变量(Field)
获取类中的方法[Met nod)
获取类的构造器[Constructor)
获取注解
通过反射调用方法
反射的应用场景
Spring的IOC容器
反射+抽象工厂式
JDBC加载数据库驱动类
反射的优势及缺陷
增加程序的灵活性
破坏类的封装性
性能损耗
代理模式
静态代理与动态代理
常见的动态代理实现
动态代理的实际应用
要量
变量汇总
实例变
全局变
静态变量
类变量
局部变量
成员变量
常量
验证过程
深入理解st aic关键字
statio基础知识
static修饰变量
statio修饰方法
statio修饰代码块
statio用作醇态内部类
静态导包
statio进阶知识
关于statio的所属类
statio修饰变量的存储位置
statio变量的生命周期
statio序列化
类加顺序
static经常用作日志打印
static经常用作单例模式
类的构造器是否是static的
String、StringBuffer和StringBuilder
String
StringBuffer
StringBuilder
深入理解String.String Bul der.String But fer
String
StringBuilder
String Buf for
StringBuilder和String But fer的扩容问题
Comparator和Comparable
从设计角度理解
对Comparable的解释
标记·清除算法
Finalizers
compare Too方法与equals) 方法的比较
compare To 0方法出异常
对Comparator的解释
Comparator比较器的方法
Comparable和Comparator的对比
谈谈强引用、软引用、弱引用、幻象引用
垃圾收集器
对象的生命周期
井发历史
线程
Re terence Queue
Reference
什么是多绳程
并发和并行的关系
优势和劣势
并发为什么会出现
线程带来的安全性问题
可见性问题
原子性问题
有序性问题
活跃性问题
性能问题
引起线程切换的几种方式
线程安全性
什么是线程安全性
原子性
流水线设计的优点
竞态条件
加锁机制
竞态条件和关键区域
并发模型和分布式系统银相
认识两个状态
并发模型
井行Worker
井行Worker的优点
井行Worker的缺点
道水线
响应式-事件驱动系统
Actor模型
Channels模型
流水线设计的缺点
函数性井行
创建井启动线程
继承Thread类来创建线程
便用Runnable接口来创建线程
便用Callable接口来创建线程
便用线程池来创建线程
Cached ThreadPool
Fl xed ThreadPool
fail-fast
fail-sade
Single Thread Executor
休眠
优先级
作出让步
后台线程
Thread Factory
加入一个线程
线程异常捕获
同步容器类
操作系统中的并发工具
信号量
互斥量
Futex es
Ticket Lock
Pthreads中的互斥量
管程
消息传递
屏障
避免锁:读-整制-更新
Java井发工具包
Java并发工具缩述
Con cum rent HashMap
Concurrent Map
Concurrent Navigable Map
Concurrent Skip List Map
Concurrent Skip List Set
Copy On Write ArrayList
Blocking Queue
Linked Blocking Queue
Blo a king Deque
版本号机制
GAS算法
ABA问题
循环开销大
CLH Lock
MCS Lock
CLH Lock和MCS Lock
Syn oh ron ized锁
偏向锁
轻级镁
重量级锁
Array Bioc king Queue
Prion ty Blocking Queue
Delay Queue
Transfer Queue
Linked Transfer Queue
A ray Deque
Concurrent Linked Deque
Linke