java NIO 相关(五) 分散(Scatter) 和聚集(Gather)
分散(Scatter) 和聚集(Gather)分散读取(scattering reads) 是从channel中读取的数据“分散”到多个buffer中
注意:按照缓冲区的顺序,写入position 和limit 之间的数据到channel
分散读取将通道中的数据分散到多个缓冲区中
聚集写入将多个缓冲区中的数据聚集到通道中
java NIO 相关(四) 通道 channel
channel 介绍通道(channel) :由java.nio.channels包定义的,channel 表示IO源与目标打开的连接 。Channel 类似于传统的流,只不过channel 本身不能直接访问数据,channel 只能与buffer进行交互
一、通道(channel)用于源节点与目标节点的连接,在java nio中负责缓冲区数据的传输。channel本身不存储数据,因此需要配合缓冲区进行传输。
流与通道的区别1、流是单向的,通道是双向的,可读可写。2、流读写是阻塞的,通道可以异步读写。3、流中的数据可以选择性的先读到缓存中,通道的数据总是要先读到一个缓存中,或从缓 存中写入
二、通道的主要实现类Java.nio.channels.Channel接口
|–FileChannel
|–SocketChannel
|–ServerSocetChannel
|–DataramChannel
三、获取通道JAVA针对支持通道的类提供了getChannel()方法
本地IO
FileInputStream/FileOutputStream
RamdomAcc ...
java NIO 相关(三) NIO 直接缓冲区和非直接缓冲区
非直接缓冲区通过allocate() 方法分配缓冲区,将缓冲区建立在jvm的内存直接与非直接缓冲区字节缓冲区要么是直接的,要么是非直接的·如果为直接字节缓冲区·则Java虐拟机会尽最大努力直接在此缓冲区上执行本机|/0操作·也就是说,在每次调用基础操作系统的一个本机1/0操作之前(或之后),虐拟机都会尽量避免将缓冲区的内容复制到中间缓冲区巾(或从中间缓冲区中复制内容)。
直接缓冲区通过allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中,可以提高效率
直接字节缓冲区可以通过调用此类的allocateDirect()工厂方法来创建·此方法返回的缓冲区透行分配和取消分配所需成本通常于非直接缓冲区·直接缓冲区的内容可以驻留在常規的垃圾回收堆之外·因此.它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机|/0操作影响的大型、持久的缓冲区·一情况下,最好舣在直接缓冲区能在程序性能方面帚来明显好处时分配它们
直接字节缓冲区还可以通过FileChanneI的map()方法将文件区域直接暌射到内存中来创建·该方法返回M ...
java NIO 相关(二) 缓冲区buffer的数据存取
简介 java nio 是jdk1.4引入的,其中包含 selector,channel,buffer 其中buffer是用来提高效率的。nio中操作数据,都是直接操作buffer对象
buffer的类型
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
java基本类型除了boolean外都有对应的buffer的对象,都是使用allocate()方法创建对应的buffer对象
Buffer 的相关属性
capacity 容量用来定义buffer的容量,在buffer初始化的时候设置,不可被修改
limit 界限
buffer的上限位置,limit <= capacity
pasition 位置
读写buffer的时候,下一个写或者读的位置 pasition小于 limit
mark 标记位置
使用mark()方法标记的位置,当调用reset()方法时,将pasition指向mark的位置
buffer 初始化 buffer 初始化调用 alloca ...
java NIO 相关(一) NIO介绍
Java NIO简介
Java nio (new io) 是从java 1.4 版本开始引入有的一个新的IO API 可以替代标准的java io API.
NIO 和原来的io有同样的作用和目的,但是使用方式完全不通,NIO支持面向缓存区的基于通道的IO操作,NIO将以更加高效的方式进行文件的读写操作。
|io|nio|
|-------|-------|
|面向流|面向缓冲区|
|阻塞io|同步非阻塞io|
|无|selector选择器
### 通道和缓冲区
Java nio 系统的核心在于:通道(channel) 和缓冲区(buffer) 通道表示打开到IO设备(例如:文件、套接字)的连接,若需要使用NIO,需要获取用于连接IO的通道以及用于容纳数据的缓冲区,然后操作缓冲区,对数据进行处理。
1. 先建立通道
2. 创建缓冲区
3. 操作缓冲区
### io 输入流的读取数据逻辑
1. io读取数据
- 打开一个io流
- 循环
- 读取数据
- 关闭io流
2. io写入数据
- 打开一个io流
- 循环
- 写入取数据
- 关闭io流
### 相 ...
java IO相关(二) BIO NIO AIO 介绍
BIObio 同步阻塞,每一个请求连接都由一个线程来处理
NIOnio 同步非阻塞,多路复用器轮询客户端的请求,每个客户端的 IO 请求会对应服务器的 一个线程
AIOaio 异步非阻塞,客户端的io请求都是由os来处理,os处理完成后再通知服务器启动线程处理 (需要操作系统支持)
进程向操作系统请求数据
操作系统把外部数据加载到内核的缓冲区中
操作系统把内核的缓冲区拷贝到进程的缓冲区
进程获得数据完成自己的功能
Java NIO 属于同步非阻塞 IO,即 IO 多路复用,单个线程可以支持多个 IO 即询问时从 IO 没有完毕时直接阻塞,变成了立即返回一个是否完成 IO 的信号。异步 IO 就是指 AIO,AIO 需要操作系统支持。
java IO相关(一) unix的五种模型
Uinx IO 模型 unix 的io 模型分为以下5类
阻塞io 当用户发起io请求后,等待数据,程序将数据从内核复制到程序缓冲区中,整个操作都是阻塞状态。
非阻塞io 当用户发起请求后,不等待数据,而是返回一个数据未准备完成的标志。 操作系统内核将准备要操作的数据,这个过程中程序会轮训的请求操作,直到操作系统将数据准备好。当程序轮训到系统内核响应数据准备好了之后,程序再将数据复制到程序自身的缓冲区
io复用模型 我们常用select和poll函数使用了io复用模型。 当用户调用select函数的时候会阻塞,select函数会系统调用操作内核进行数据报的准备工作。当数据报准备完成后,程序直接复制数据包的内容到程序缓冲区中,io复用现在看来和阻塞io没有什么区别。但是当用户比较多的时候优势就展现出来了,假设有100个用户阻塞io会阻塞100个进程处理io.如果是io复用模型,则用1个线程去管理这100个io请求。
信号驱动io我们可以使用信号.当用户发起io请求后,使程序接受操作系统的信号通知。不等待数据。此时操作系统进行数据报的准备,当数据报准备完成之后会以信号的方式通知程序。程 ...
java 基础知识点整理(三)
(1) 枚举的jdk实现 下面是枚举代码
1234567891011121314public enum Labels0 { ENVIRONMENT("环保"), TRAFFIC("交通"), PHONE("手机"); private String name; private Labels0(String name) { this.name = name;}public String getName() { return name; } }
在编译后生成的字节码如下:可以看到枚举被编译后就是一个类,被编辑为final并且继承Enum里面的枚举都是static finak的常量,静态的所以是单例的重点:++枚举类型没有可以访问的构造器,是真正的 final;是实例受控的,它们是单例的泛型化; 本质上是单元素的枚举;提供了编译时的类型安全。 单元素的枚举是实现单例的最佳方法!++
(2) jdk序列化 定义:将实现Serializable接口的 ...
java 基础知识点整理(二)
(1) 抽象类和接口区别:
抽象类可以有的方法可以有普通方法,接口的方法全都是抽象方法
抽象类可以用普通成员变量,接口中只有常量也就是,static final的
抽象类是单继承,接口可以多继承
(2) 面向对象的三大特性
封装 将对象属性封装起来,只提供相关方法保障对象安全性,隐藏细节性。
继承代码复用,增加扩展性
多态允许对象的不通子类对一个方法作出多种实现。
多态的三个条件,继承,子类重写夫类的方法,父类的引用只想子类的实现
(3) 重写和重载
重写 子类重写夫类的方法,根据子类的类型调用具体的方法
重载在同类下,方法名相同,参数数量不同
(4) ThreadLocal(线程局部变量) 线程之间共享变量是有风险的,如果想每一个线程使用自己的变量可以使用ThreadLocal来实现 ThreadLocal 实际上是使用 ThreadLocalMap 来实现的 key 存储的是ThreadLocal,value为当前线程存储的变量 因为线程都有一个ThreadLocalMap 的属性。 1. set方法 (1) 获取当前线程 ...
java 基础知识点整理(一)
(1)JDK & JRE & JVM 的关系
JDKJDK包含jre、java开发工具、java核心类库
JREjre是运行java程序的环境,包含java核心类库,和jvn的标准实现
JVM是java虚拟机,实现java跨平台最核心的部分
(2)跨平台
因为jvm运行的是java编译后的字节码文件,因为jvm可以在多个平台安装,所以字节码文件就可以在多个平台的jvm上面运行.从而实现一次编译到处运行
(3)基础数据类型 整型: byte、short、int、long 浮点型:double、float 逻辑型:boolean 字符型:char 长度 byte(1) 2的-7次方 到2的7次方-1 short(2) 2的-15次方 到 2的 15 次方-1 int(4) long(8) double(8) float(4) boolean(1/8) char(2)
(4)自动装箱,自动拆箱 自动装箱:
1Integer i= 100; // 基本类型自动装箱为包装类,编译器会优化为 Integer i ...