Java NIO (一)--简介
来源:互联网 发布:照片扫描软件手机版 编辑:程序博客网 时间:2024/06/07 06:11
一、简介
Java NIO (New IO)是JDK1.4后引入的新输入/输出API,提供基于缓冲区(buffer)的块写入/读取,而以前的I/O是基于流(Stream)的方式,NIO基于块的IO操作,将最耗时的缓存区读取和填充交由底层操作系统实现,因此速度上要快得多;主要由以下三个核心部分组成:
1.Channel
2. Buffer
3. Selector
二、Channel - 通道
通道可以理解为以前的“流”,数据从通道读取,也可以向通道写入数据,是双向的,但是读取和写入都必须是使用Buffer,即读取数据时,需要从通道读取到缓存区,然后再从缓冲区获取数据,写入数据也需要先将数据写入到缓存区,再将缓冲区写入通道;
NIO中主要有以下通道类型:
- FileChannel - 文件IO
- DatagramChannel - UDP传输
- SocketChannel - TCP传输
- ServerSocketChannel -TCP传输
三、Buffer - 缓冲区
缓冲区可以认为是一个数据容器,可以理解为一个基本数据类型数组,如字节数组等;NIO中任何数据输入/输出都是必须经由缓冲区实现,主要有以下缓冲区类型:
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- MappedByteBuffer
可以看出以上类型覆盖Java的全部基本类型,MappedByteBuffer(内存映射文件,后续章节讲解)对于每种Buffer都有相同的方法,只有ByteBuffer拥有部分特殊的方法
向Buffer中写数据
写数据到Buffer有两种方式:
· 从Channel写到Buffer。
· 通过Buffer的put()方法写到Buffer里。
从Channel写到Buffer的例子 :
int bytesRead = inChannel.read(buf); //read into buffer.
通过put方法写Buffer的例子:buf.put(127);
从Buffer中读取数据
从Buffer中读取数据有两种方式:
· 从Buffer读取数据到Channel。
· 使用get()方法从Buffer中读取数据。
从Buffer读取数据到Channel的例子:
//read from buffer into channel. int bytesWritten = inChannel.write(buf);
使用get()方法从Buffer中读取数据的例子 :byte aByte = buf.get();
四、Selector - 选择器
选择器支持单个线程处理多个Channel,将多个Channel注册到一个选择器中,选择器基于事件的方式处理;从选择器获取注册Channel中关注的事件(如读、写)并进行数据处理,非常适用于多个数据量不大、读写不频繁的通道,使用单个线程来处理;
五、NIO简单(标准)的输入/输出
五、NIO简单(标准)的输入/输出
一个简单(标准)的NIO输入输出一般包含如下步骤:
1. 从数据源获取通道
2. 分配缓冲区
3. 切换缓存区为写模式
4. 从通道读取数据写入缓冲区
5. 切换缓冲区为读模式
6. 缓冲区数据写入通道中
7. 关闭资源
实例代码如下:
package com.denny.aio.test;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class Test {public static void main(String[] args) throws IOException {RandomAccessFile formFile = new RandomAccessFile("src\\a.txt", "rw");RandomAccessFile toFile = new RandomAccessFile("src\\b.txt", "rw");//获取channelFileChannel fromChannel = formFile.getChannel();FileChannel toChannel = toFile.getChannel();// 定义缓冲大小int bufSize = 1024*4;// 定义缓冲ByteBuffer byteBuffer = ByteBuffer.allocate(bufSize);int len = 0;// 将数据从源channel写入到缓冲区while( (len=fromChannel.read(byteBuffer)) !=-1 ){//切换到读模式byteBuffer.flip();//读取缓冲区数据写到目标channeltoChannel.write(byteBuffer);// 清空缓冲byteBuffer.clear();}// 释放资源toChannel.close();fromChannel.close();}}
0 0
- Java NIO (一)--简介
- Java NIO 学习(一)--简介
- java学习-NIO(一)简介
- Java-NIO(一):简介
- Java NIO系列教程(一)java NIO简介
- Java 之NIO(一) - 简介(Buffer)
- NIO学习一、NIO简介
- Java NIO 之 NIO 简介
- Java NIO 基础简介
- java nio简介
- 主题:JAVA NIO 简介
- JAVA NIO 简介
- 主题:JAVA NIO 简介
- JAVA NIO 简介
- Java NIO简介
- JAVA NIO 简介
- 主题:JAVA NIO 简介
- JAVA NIO 简介
- 网络流24题19. 负载平衡问题
- Dubbox新特性--在Dubbo中开发REST风格的远程调用--快速入门
- 旋涡JAVA笔记--集合的前世今生2 —— 陌上人如玉
- (12) spring boot集成MyBatis
- 4.最近距离
- Java NIO (一)--简介
- 在Eclipse中安装SVN客户端插件的两种方式
- ffmpeg(一) android ndk编译ffmpeg
- JSTL (JSP Standard Tag Library)
- leetcode:用两个栈实现一个队列 Implement Queue using Stacks
- 机器学习那些知识点
- 跨平台搭建环境,开发工具
- 5.股票风险
- 记录从零开始在Ubuntu 16.04 上部署Ruby on rails 项目