概述

这本书讲解的一般吧,主要是讲解了

缓冲区
通道
选择器
正则表达式
字符集

主要是讲解了api的使用,以及部分系统知识,比较底层了,而且大部分都是代码的源码讲解,或者api使用的讲解,太细致了。

学netty之前可以看看这个,或者两者互相弥补。

建议是 如果不用Netty,那么就不要学了,比较底层,看了会忘记。

我是硬着头皮粗略了看了一遍,有空的话,再看第二遍吧。

1.简介

java io 与 系统io的区别

在大多数情况下, Java 应用程序并非真的受着 I/O 的束缚。操作系统并非不能快速传送
数据,让 Java 有事可做;相反,是 JVM 自身在 I/O 方面效率欠佳。操作系统与 Java 基于流的 I/O
模型有些不匹配。操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取
(DMA)的协助下完成的。而 JVM 的 I/O 类喜欢操作小块数据——单个字节、几行文本。结果,
操作系统送来整缓冲区的数据, java.io 的流数据类再花大量时间把它们拆成小块,往往拷贝一
个小块就要往返于几层对象。操作系统喜欢整卡车地运来数据, java.io 类则喜欢一铲子一铲子
地加工数据。有了 NIO,就可以轻松地把一卡车数据备份到您能直接使用的地方( ByteBuffer 对
象)。

只要坚持使用基于数组的 read( )和 write( )方法。这些方法与底层操作系统调用相当接近,尽管必须保留至少一份缓冲区拷贝。

缓冲区,以及缓冲区如何工作,是所有 I/O 的基础。所谓“输入/输出”讲的无非就是把数据移进或移出缓冲区。

I/O 缓冲区操作简图

三个缓冲区的发散读操作

内存空间多重映射

前提条件是,内核与用户缓冲区必须使用相同的页对齐,缓冲区的大小还必须是磁盘控制器块大小(通常为 512 字节磁盘扇区)的倍数。操作系统把内存地址空间划分为页,即固定大小的字节组。内存页的大小总是磁盘块大小的倍数,通常为 2 次幂(这样可简化寻址操作)。

页错误随即产生一个陷阱(类似于系统调用),把控制权移交给内核,附带导致错误的虚拟地址信息,然后内核采取步骤验证页的有效性。

1.4.1 文件IO

  1. 磁盘属硬件设备,对何谓文件一无所知.
  2. 文件系统是更高层次的抽象,是安排、解释磁盘(或其他随机存取块设备)数据的一种独特方式。

用户内存到文件系统页的映射

文件锁定

  1. 文件锁定机制允许一个进程阻止其他进程存取某文件,或限制其存取方式。通常的用途是控制共享信息的更新方式,或用于事务隔离。在控制多个实体并行访问共同资源方面,文件锁定是必不可少的。数据库等复杂应用严重信赖于文件锁定

文件锁定有两种方式:共享的和独占的。多个共享锁可同时对同一文件区域发生作用;独占锁则不同,它要求相关区域不能有其他锁定在起作用。

2.缓冲区

  1. 缓冲区是包在一个对象内的基本数据元素数组。

2.1 属性

所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息。它们是:

容量(Capacity)

缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。

上界(Limit)

缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。

位置(Position)

下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新。

标记(Mark)

一个备忘位置。调用 mark( )来设定 mark = postion。调用 reset( )设定 position =mark。标记在设定前是未定义的(undefined)。

这四个属性之间总是遵循以下关系:

0 <= mark <= position <= limit <= capacity

这一章主要介绍各种buffer。

2.2 flip

Flip()函数将一个能够继续添加数据元素的填充状态的缓冲区翻转成一个准备读出元素的释放状态。

类似于下面的代码

buffer.limit(buffer.position()).position(0);

2.3 clear

Clear()函数将缓冲区重置为空状态。 它并不改变缓冲区中的任何数据元素,而是仅仅将上界设为容量的值,并把位置设回 0。

2.4 mark

标记,使缓冲区能够记住一个位置并在之后将其返回。缓冲区的标记在 mark( )函数被调用之前是未定义的,调用时标记被设为当前位置的值。 reset( )函数将位置设为当前的标记值。如果标记值未定义,调用 reset( )将导致 InvalidMarkException 异常。一些缓冲区函数会抛弃已经设定的标记( rewind( ), clear( ),以及 flip( )总是抛弃标记)。如果新设定的值比当前的标记小,调用limit( )或 position( )带有索引参数的版本会抛弃标记.

2.5 比较

两个缓冲区被认为相等的充要条件是:32

  1. 两个对象类型相同。包含不同数据类型的 buffer 永远不会相等,而且 buffer绝不会等于非 buffer 对象。
  2. 两个对象都剩余同样数量的元素。 Buffer 的容量不需要相同,而且缓冲区中剩余数据的索引也不必相同。但每个缓冲区中剩余元素的数目(从位置到上界)必须相同。
  3. 在每个缓冲区中应被 Get()函数返回的剩余数据元素序列必须一致。

两个被认为是相等的缓冲区

两个被认为不相等的缓冲区

3.6 字节顺序

大端字节顺序

小端字节顺序

多字节数值被存储在内存中的方式一般被称为 endian-ness(字节顺序)。如果数字数值的最高字节——big end(大端),位于低位地址,那么系统就是大端字节顺序。如果最低字节最先保存在内存中,那么小端字节顺序。

ByteOrder 类定义了决定从缓冲区中存储或检索多字节数值时使用哪一字节顺序的常量。

ByteBuffer 类有所不同:默认字节顺序总是 ByteBuffer.BIG_ENDIAN,无论系统的固有字节顺序是什么。 Java 的默认字节顺序是大端字节顺序。

3.6.1 直接缓冲区

3.通道

4.选择器

5.正则表达式

6.字符集

【读书笔记】Java NIO (中文版) 读书笔记相关推荐

  1. java jdk 8学习笔记,Java JDK 8学习笔记 PDF_源雷技术空间

    资源名称:Java JDK 8学习笔记 PDF 内容简介: ●本书是作者多年来教学实践经验的总结,汇集了学员在学习课程或认证考试中遇到的概念.操作.应用等问题及解决方案 ●针对Java SE 8新功能 ...

  2. java createchannel_【原创】java NIO FileChannel 学习笔记 新建一个FileChannel

    首先使用FileChannel 的open方法获取一个FileChannel对象.下面这段代码是FileChannel中open方法的代码. public static FileChannel ope ...

  3. 学习笔记Java小游戏学习笔记

    [尚学堂]Java300集零基础适合初学者视频教程_Java300集零基础教程_Java初学入门视频基础巩固教程_Java语言入门到精通_哔哩哔哩_bilibili 图片的插入图片的插入之前的方法太过 ...

  4. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  5. Java核心技术卷一读书笔记

    文章目录 Java核心技术卷一读书笔记 第一章 Java程序设计概述 1.1 关键特性 第二章 Java程序设计环境 2.1 使用命令行工具 第三章 Java的基本查询设计结构 3.1 数据类型 3. ...

  6. 《Head First Java》20201023读书笔记

    P413-P <Head First Java>20201023读书笔记 操作Swing组件 几个常用组件:text field.可滚动的text area.checkbox以及list. ...

  7. [转载]Java完美经典读书笔记

    java完美经典读书笔记 第一章 概述 第二章 JAVA语言基础 ※关键字: 基本数据类型:  byte  short  int  char long float double boolean 循环控 ...

  8. 读书笔记--Java核心技术--高级特征

    第一章--流与文件---------------------------------------------- 流 读写字节 java.io.InputStream 1.0 abstractint r ...

  9. java编程思想读书笔记

    多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与初始化顺序相反 编写构造器时有一条有效的准则:"尽可能用简单的方法使对象进入 ...

最新文章

  1. div+css相对定位和绝对定位
  2. 【细说软件工程】《软件工程》Software Engineering
  3. asp.net httprequest httpresponse
  4. vue router-link子级返回父级页面
  5. 如何从命令行删除MongoDB数据库?
  6. Tensorflow——Tensorboard可视化
  7. Python文件输入输出
  8. ROS:ModuleNotFoundError: No module named ‘rospkg‘
  9. svg 地图_用于Power BI的SVG省市地图(带数据标签,含下载)
  10. API接口名称(item_search - 按关键字搜索淘宝商品)[item_search,item_get,item_search_shop等]
  11. 巧妙实现 Form 表单认证跨站点、跨服务器的单点登录(Single Sign On)
  12. 基于hal的hcsr04使用注意事项(f103c8t6)
  13. (R语言)R的统计模型
  14. 带节日和农历的js日历
  15. 给新手程序员的一点学习建议
  16. 安装sts插件遇到的问题,cannot perform
  17. c++|纯虚函数之再谈星际争霸
  18. 华为机试题:【中级】报文转换
  19. 论文翻译:2000_narrowband to wideband conversion of speech using GMM based transformation
  20. 07 基于python实现超级画板(完整的代码+说明文档+可执行程序exe)

热门文章

  1. 投行称在三季度所产iPhone中 iPhone 13将超过35%
  2. 荣耀X20 SE评测:6400万高清美拍 2000元以下真香现场
  3. 岚图FREE店内静态体验
  4. 外媒:苹果正研发新的Apple Watch机型 显示屏和速度将升级
  5. 违法收集使用个人信息 抖音、快手、猎聘等105款App被点名
  6. 谁敢花35万再加盟瑞幸?
  7. 华为首家欧洲生产厂选择落户法国小镇 将为4G/5G基站生产零部件
  8. 罗永浩电商直播尘埃落定?有图有真相,坐等相声开播...
  9. 董明珠自媒体:格力口罩今日开售 上午预约下午抢购
  10. 京东进一步回应“承兴事件”:歌斐自身存在风控缺陷