3. IO概述

2017-11-22  本文已影响0人  Wille_Li

1. IO基本实现

1.1 字节流(stream)

个人理解: 以字节为单位对文件本身直接操作。
主要接口

InputStream & OutputStream

主要实现

FileInputStream & FileOutputStream
FilterInputStream & FilterOutputStream
ByteArrayInputStream & ByteArrayOutputStream

1.2 字符流(buffer)

个人理解:以字符为单位利用缓冲区对文件操作,具体读(写)操作会先读(写)缓冲区。

关于字节流和字符流的区别

实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的,但是字符流在操作文件的时候是会用到缓冲区的,是通过缓冲区来操作文件的。

读者可以试着将上面的字节流和字符流的程序的最后一行关闭文件的代码注释掉,然后运行程序看看。你就会发现使用字节流的话,文件中已经存在内容,但是使用字符流的时候,文件中还是没有内容的,这个时候就要刷新缓冲区。

IO缺点

按字节操作,效率不高, 大部分线程都在阻塞,浪费计算资源;
当数据源没有数据,则IO阻塞。

2. NIO (全称java non-blocking IO, 无阻塞IO)

在了解NIO之前,先搞清楚Java程序文件读写虚拟内存的原理。
Java程序文件读写(IO)
当应用程序需要读取文件的时候,内核首先通过DMA技术将文件内容从磁盘读入内核中的buffer,然后Java应用进程再从内核的buffer将数据读取到应用程序的buffer。
简单点说:先从Disk(硬盘)读到Kernel(内核),再从Kernel(内核)读到进程(Process)的buffer。下图就是IO读工作原理:

IO工作原理

为了提升I/O效率和处理能力,操作系统采用虚拟内存的机制。
虚拟内存(交换内存)
虚拟内存实际上是Disk上得文件,主要作用有两个:

知道上面虚拟内存原理,继续NIO的核心内容。
Java NIO 主要由以下三个核心部分组成:

** NIO主要实现:**

NIO2

NIO2是Java7 添加了4个异步通道,分别包括:

NIO.2 的异步通道 APIs 提供方便的、平台独立的执行异步操作的标准方法。这使得应用程序开发人员能够以更清晰的方式来编写程序,而不必定义自己的 Java 线程,此外,还可通过使用底层 OS 所支持的异步功能来提高性能。如同其他 Java API 一样,API 可利用的 OS 自有异步功能的数量取决于其对该平台的支持程度。
自己理解: NIO2在原来的NIO包加入了异步处理的API。
返回Future结果集,更好控制IO异步处理。

对象序列化

序列化的原理
Serialization(序列化)是一种将对象以一连串的字节描述的过程。
反序列化的原理
反序列化deserialization是一种将这些字节重建成一个对象的过程。

序列化的意义
Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。
这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。

如何序列化
一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。
有了这个标记的Class就能被序列化机制处理。

Java序列化算法

serialVersionUID值的重要作用
根据上面的分析,可以发现如果一个类可序列化,serialVersionUID建议给一个确定的值,不要由系统自动生成,否则在增减字段(不能修改字段类型及长度)时,如果两边的类的版本不同会导致反序列化失败.

参考:
基于java的nio消息实现方式优缺点分析及示例代码说明
java nio原理和它的优点

以上纯属个人理解,有误请指正。谢谢!

上一篇 下一篇

猜你喜欢

热点阅读