Java NIO (一)

Java NIO

核心部分(简单来说):

Channels (通道)

Buffers    (缓冲区)

Selectors    (选择器)

-----------------------------------------------------

Channel实现:

 FileChannel  (从文件中读写数据)

   DatagramChannel    (能通过UDP读写网络中的数据 )

  SocketChannel    (能通过TCP读写网络中的数据)

 ServerSocketChannel    (可以监听新进入的TCP连接,像WEB服务器一样,对每一个新连接都建立一个SocketChannel )

-----------------------------------------------------

Buffer实现:

对应七种基本类型的:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer

以及 MappedByteBuffer

-----------------------------------------------------

Selector : 选择器允许单线程中处理多个Channel

-----------------------------------------------------

NIO与传统IO的不同点

1:通道既可以读取数据、也可以写入数据到通道。

2:通道可以异步读写数据

3:通道中的数据总是要先读取到一个Buffer,或总要从一个Buffer中写入

public static void main(String[] args) throws IOException {
		RandomAccessFile aFile = new RandomAccessFile("d:/缴费商户记录.txt","rw");
		FileChannel inChannel = aFile.getChannel();
		ByteBuffer buff = ByteBuffer.allocate(64); //设定缓冲区大小

		int byteRead = 0;//inChannel.read(buff);  从通道读取数据到缓冲区

		while(byteRead != -1){
			//System.out.println("Read---------->" + byteRead);
			buff.flip(); //反转。切换读/写模式
			while(buff.hasRemaining()){ //检测缓冲区
				System.out.print((char) buff.get());  //取数据
			}
			/**clear()方法会清空整个缓冲区**/
		  //buff.clear();

			/**compact()方法只会清除已经读过的数据。
				任何未读的数据都被移到缓冲区的起始处,
				新写入的数据将放到缓冲区未读数据的后面。**/
			buff.compact();
			byteRead = inChannel.read(buff);
		}
		aFile.close();
	}

buffer与channel进行交互:

    Channel读取数据到Buffer中;        

    将Buffer的数据写入到Channel;

Buffer的基本用法——四个步骤:

1:写入数据到Buffer。

2:调用flip()方法,反转读/写模式。

3:从Buffer中读取数据。

4:调用clear() 或者 compact()方法。

a:在向Buffer写入数据时,Buffer会记录写入了多少数据,一旦要读取这些数据,需要通过flip()方法,将Buffer从写模式谢欢到读模式。

b:一旦读完所有数据,就需要清空缓冲区,让它可以再次读写。

Buffer的工作原理:

缓冲区本质上市一块可以读写数据的内存,它被包装成NIO的Buffer对象。

三个属性:  capacity、position、limit

capacity:总容量,也就是获取缓冲区时设定的值

position:当前读或写的位置。

position和limit的值取决于buffer处于读模式还是写模式

在写数据到buffer时,position表示当前的位置,初始为0,当一个数据写入到buffer后,position会向前移动到下一个可以插入数据的位置。position最大可为 :capacity - 1

读取数据时:从写模式切换到读模式,position会被置为0,读取将从position的位置开始,读取后position向前移动到下一个位置。

limit : 在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。 写模式下,limit等于Buffer的capacity。

当切换Buffer到读模式时, limit表示你最多能读到多少数据。因此,当切换Buffer到读模式时,limit会被设置成写模式下的position值。换句话说,你能读到之前写入的所有数据(limit被设置成已写数据的数量,这个值在写模式下就是position)

==================

时间: 2024-11-06 21:24:15

Java NIO (一)的相关文章

Java NIO (五) 管道 (Pipe)

Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 如下图: 向管道写数据: 从管道读数据: 1. 从读取管道的数据,需要访问source通道. 2. 调用source通道的read()方法来读取数据

Java NIO中的缓冲区Buffer(一)缓冲区基础

什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的源码),Buffer类内部其实就是一个基本数据类型的数组,以及对这个缓冲数组的各种操作: 常见的缓冲区如ByteBuffer.IntBuffer.DoubleBuffer...内部对应的数组依次是byte.int.double... 与通道的关系 在Java NIO中,缓冲区主要是跟通道(Chann

Java NIO通信框架在电信领域的实践

Java NIO通信框架在电信领域的实践 此文配图有错,华为电信软件V1版逻辑架构图与华为电信软件V2 MVC版逻辑架构图两张配图是同一张啊 另:我觉得作者在本文中遇到由于同步io引起的历史遗留问题更多的是架构的问题,在作架构时就需要考虑到同步io引起的阻塞问题,我觉得比较好的解决方案是使用排队的方式来下发请求,而不是每次下发请求都启一个线程,这样如果对方还是响应慢的话即使是用nio也是解决不了问题的.

java nio

NIO 是java nonblocking(非阻塞) IO 的简称,在jdk1.4 里提供的新api .Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持.字符集编码解码解决方案. Channel :一个新的原始I/O 抽象. 支持锁和内存映射文件的文件访问接口. 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O . Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,之前,在打开

JAVA NIO 内存映射(转载)

原文地址:http://blog.csdn.net/fcbayernmunchen/article/details/8635427 Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当

java nio 大白话描述(一)

java nio基本上常用的组件,selector,channel,buffer.这三个,其他的可以用到的时候再去参考就可以了. 看一本书的时候,基本看前三章或者四章基础知识,剩下的,实际生产中用到了再去看就可以. 大白话解释这三个重要的单词 Channel: Java的nio中,channel其实是用于传输的,也可以说是管道,是一个工具,可以对比一下io中的流,很类似.但是io中的流都是单向的,但是channel通道是双向的,就是这个通道里既可以读,也可以往里面写.这个channel跟buff

Java NIO -- 管道 (Pipe)

Java NIO 管道是2个线程之间的单向数据连接. Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 举个例子: package com.soyoungboy.nio; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import org.junit.Test; public class TestPipe { @Tes

Java NIO(六) Selector

Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是本文所涉及到的主题列表: 为什么使用Selector? Selector的创建 向Selector注册通道 SelectionKey 通过Selector选择通道 wakeUp() close() 完整的示例 为什么使用Selector? 仅用单个线程来处理多个Channels的好处是,只需要更少的

Linux IO模型与Java NIO

概述看Java NIO一篇文章的时候又看到了"异步非阻塞"这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点.决定仔细研究一下.本文试图研究以下问题: web server原理,bio的connector与nio的connector在架构上到底什么区别? NIO的优势到底在哪里,是如何应用到实践中的? 同步/异步.阻塞/非阻塞到底是什么概念,引出的IO模型同步阻塞.同步非阻塞.异步阻塞.异步非阻塞的具体使用场景,适用的场景是怎样的? bio nio也

Java NIO (二) 缓冲区(Buffer)

缓冲区(Buffer):一个用于特定基本数据类型的容器,由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的Buffer 主要用于和NIO中的通道(Channel)进行交互, 数据从通道(Channel)读入缓冲区(Buffer)或者从缓冲区(Buffer)写入通道(Channel).如下,我画的一个简图,Chanenl直接和数据源或者目的位置接触,Buffer作为中介这,从一个Channel中读取数据,然后将数据写入另一个Channel中. Bu