深入分析Java Web技术内幕-第二章




深入分析Java I/O机制

Java I/O类库的基础架构

类库大概分为四组:

基于字节操作的I/O接口:InputStream 和 OutputStream
基于字符操作的I/O接口: Writer和Reader
基于磁盘操作的I/O接口: File
基于网络操作的I/O接口: Socket
(这尼玛也能划到一起,不过这样好像也行)

基于字节的I/O操作接口

InputStream

OutputStream

详见JDK API.

Tip: 操作数据可以组合使用->某流转某流
OutputStream out=new PipeOutputStream(new ObjectOutputStream(new FileOutputStream("fileName")));

还有一点是一定要制定流最终要写到哪里

基于字符的I/O操作接口

I/O接口一般都是字节流,但是为了方便起见,也有字符流.

字符到字节必须经过编码转换,而编码很耗时

写字符接口以及涉及到的类

Writer类提供了一个抽象接口:Write(char cbuf[],int off,int len)

读字符

int Read(char cbuf[],int off,int len)
返回读到的n个字节数

他们只规定了读取和写入的方式,但没有规定读和写到哪里去.

字节与字符的转化接口

数据持久化或网络传输都是以字节进行的,所以必要有对应的接口

InputStreamReader是字节到字符的桥梁,InputStream到Reader的过程要指定编码字符集,否则将采用操作系统默认字符集,很可能会出现乱码.
StreamDecoder是字节到字符解码的实现类.

StreamEncoder类似

磁盘I/O工作机制

应用程序访问文件的几种方式

read()和write()这两个是系统调用.
系统调用可能会存在内核空间地址和用户空间地址切换的问题,这是操作系统为了保护系统本身的运行安全而将内核程序运行使用的内存空间和用户活动使用的内核空间隔离,但是这样虽然保证了内核程序运行的安全性,但是也必然存在时间耗费的问题

磁盘I/O非常缓慢,所以操作系统使用了缓存的机制.

标准访问文件方式

直接I/O方式

直接IO就是直接访问磁盘数据,来减少从内和缓冲区到用户活动区的复制.

这种思想常用于 由应用实现的数据库管理系统.
提前将热点数据加入内存,可以加速数据的访问速度.

但操作系统并不知道哪些是热点数据,所以直接I/O也有负面影响.而我们一般将异步IO和直接IO结合使用.

直接IO方式如图(没有穿过高速页缓存):

同步访问文件方式

即读取与写入都是同步操作的.

但他的标志是:只有写入完成才是成功的标志

性能较差

异步访问文件方式

异步访问就是,当访问数据的线程发出请求后,线程会继续去处理其它事情,而不是阻塞等待,当请求的数据返回后再继续处理接下来的操作.

这种方式可以明显的提高应用程序的效率,但并不会改变访问文件的效率.

内存映射方式

将操作系统某一块区域与磁盘中的文件关联起来,增加缓冲区的个数,减少缓冲区->用户活动区的复制操作

Java访问磁盘文件

接下来我们来讨论数据的流向

数据持久化到磁盘

数据在磁盘中唯一最小描述就是文件.

文件也是操作系统和磁盘驱动器交互的最小单元

Java中的File并不代表一个真实存在的对象.而是一个路径和虚拟对象.
因为我们更多关心的是操作,而不是整个文件.

从磁盘中读取文件流程:

  • 先创建一个FileDescriptor对象
  • 然后创建FileInputStream
  • 因为要读取的是字符格式,所以需要StreamDecoder类将byte解码为char格式...

One Comment

发表评论