JavaNIO,AIO

  1. Java NIO简介
    Java NIO(New IO Non Blocking IO)是从Java1.4版本开始引入的一个鑫的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区基于通道的IO操作。NIO将以更加高效的方式进行文件的速写操作。
    IO与NIO的区别
    在这里插入图片描述
    Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到IO设备(例如:文件,套接字)的链接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,堆数据进行处理。
    简而言之,channel负责传输,Buffer负责存储。
    缓冲区(Buffer):在Java NIO中负责数据的存取,缓冲区就是数组。用于存储不同数据类型的数据,根据数据类不同(除了boolean类型),提供了相应的基本数据类型的缓冲区,缓冲区的管理方式几乎一直,通过allocate()获取缓冲区
    缓冲区存取数据的两个核心方法:
    put():存入数据到缓冲区中
    get():从缓冲区获取到数据
    缓冲区的四个核心属性:
    capacity:容量,表示缓冲区中最大存储数据的铜梁。一旦什么不能改变。
    limit:界限,表示缓冲区中可以操作数据的大小。limit后面的数据不能进行读写
    position:位置,便是缓冲区中正在操作数据的位置
    mark:标记,表示缓冲区中正在操作数据的位置
    flip():切换到读取数据模式
    rewind():可重复读
    clear():清空缓冲区,但是缓冲区中的数据依然存在,但是处于被遗忘状态,里面的position,limit , capacity回到初始状态。
    mark():标记当前position的位置
    reset();将position恢复到mark标记的位置
    hasRemaining:是否还有可操作的数据
    remaining():获取可操作数据的个数
    非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM内存中
    在这里插入图片描述
    直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内春中。可以提高效率。
    管道(Channel):用于源节点与目标的的连接,在Java NIO中负责缓冲区中的数据的传输。channel本身不存储数据。
    通道的主要实现类
    Java.nio.channels.channel接口
    FileChannel
    SocketChannel
    ServerSocketChannel
    DatagramChannel
    获取通道
    Java针对支持通道的类提供了getChannel()方法
    本地IO:
    FileInputStream/FileOutputStream
    RandomAccessFile
    网络IO:
    Sokect
    ServerSokect
    DatagramSocket
    在JDK1.7中的NIO.2针对各个通道提供了静态方法open()
    在JDK1.7中的NIO.2的Files工具类的newByteChannel()
    通道之间的数据传输
    通过非直接缓冲区进行传输
public static void main(String[] args) throws Exception {
		/* 步骤:
		 * 第一步创建文件对象FileIputStream,FileOutputStream
		 * 第二步:得到channel通道
		 * 第三步:创建字节缓冲区,并将数据写到字节缓冲区里面
		 * 第四步:将缓冲区的数据写到指定文件
		 * 
		*/
		FileInputStream fis = new FileInputStream("a.jpg");
		FileOutputStream fos = new FileOutputStream("1.jpg");
		
		FileChannel iChannel = fis.getChannel();
		FileChannel oChannel = fos.getChannel();
		
		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
		while (iChannel.read(byteBuffer)!=-1) {
			byteBuffer.flip();
			oChannel.write(byteBuffer);
			byteBuffer.clear();
		}
		oChannel.close();
		iChannel.close();
		fos.close();
		fis.close();
	}

通过直接缓冲区进行传输

public static void main(String[] args) throws Exception {

		FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
		FileChannel outChannel = FileChannel.open(Paths.get("3.jpg"), StandardOpenOption.CREATE_NEW,
				StandardOpenOption.WRITE, StandardOpenOption.READ);

		MappedByteBuffer inBuffer = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
		MappedByteBuffer outBuffer = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());

		byte[] buf = new byte[inBuffer.limit()];
		System.out.println(inBuffer.limit());
		inBuffer.get(buf);
		outBuffer.put(buf);

	}

transferTo 和transferFrom

public static void main(String[] args) throws Exception {

		FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
		FileChannel outChannel = FileChannel.open(Paths.get("3.jpg"), StandardOpenOption.CREATE_NEW,
				StandardOpenOption.WRITE, StandardOpenOption.READ);

		inChannel.transferTo(0, inChannel.size(), outChannel);
		inChannel.close();
		//这里有两个方法 transferTo 和transferFrom,所以上面两行代码等价于
		//outChannel.transferFrom(inChannel, 0, inChannel.size());
		//outChannel.close();

	}

分散(Scatter)和聚集(Gather)

字符集:Charset

在这里插入图片描述
编码:字符串->字节数组
解码:字节数组->字符串

  1. Java NIO与IO的主要区别
  2. 缓冲区(Buffer)和通道(channel)
  3. 文件通道(FileChannel)
  4. NIO的非阻塞式网络通信
  5. 管道(Pipe)
  6. Java NIO2(Path, Paths与Files)
jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、第五课netty线程模型源码分析(二) 06、第六课netty5案例学习 07、第七课netty学习之心跳 08、第八课protocol buff学习 09.第九课自定义序列化协议之自定义序列化协议 10、第十课自定义数据包协议 11.第十一课粘包分包分析,如何避免socket攻击 12.分析设计一个聊天室的小项目 二、java NIO,AIO编程视频教程 1、java NIO,AIO编程_01.flv 2、java NIO,AIO编程_02.flv 3、java NIO,AIO编程_03.flv 4、java NIO,AIO编程_04.flv 5、java NIO,AIO编程_05.flv 三、Java语言基础教程-Java NIO流篇 [第1节] Java NIO流-简介和概述.flv [第2节] Java NIO流-缓冲区.flv [第3节] Java NIO流-缓冲区操作.flv [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv 四、Mina视频教程 00、Mina视频课程介绍.flv 01、Mina服务端helloWorld入门.flv 02、Mina客户端helloWorld入门.flv 03、Mina整体体系结构分析.flv 04、Mina学习之长短连接.flv 05、Mina学习之MinaIOService接口.flv 06、Mina学习之MinaIOFilter接口.flv 07、Mina学习之MinaIOSession接口.flv 08、Mina学习之MinaIOProcessor线程模型.flv 09、Mina学习之MinaIOBuffer接口.flv 10、Mina学习之自定义协议介绍.flv 11、Mina学习之自定义协议数据包分析.flv 12、Mina学习之自定义协议数据包实现.flv 13、Mina学习之自定义协议-编码器.flv 14、Mina学习之自定义协议-解码器.flv 15、Mina学习之自定义协议-服务端实例.flv 16、Mina学习之自定义协议-客户端实例.flv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值