JavaNIO
Posted 叶落之秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaNIO相关的知识,希望对你有一定的参考价值。
Java New IO 简称 nio,在jdk1.4提供了新的api,有如下特性:
1.为所有原始类型提供缓存支持
2.字符集编解码解决方案
3.Channel:新的原始io抽象
4.支持锁和内存映射的访问接口
5.提供多路(non-bloking)非阻塞式多路高伸缩性网络io
nio的两个创新:
缓冲区
通道
原始io与nio比较:
1.原始java.io.*包库与nio最重要的区别是数据打包和传输方式,io中使用流的方式处理数据,nio中使用块的方式处理数据。
流:流方式处理数据是输入一个字节,输出一个字节。处理比较慢
块:块的方式处理数据每步操作产生或者消费一个数据块,处理速度快。
数据缓冲区:
找了个博客,里面有比较详细的介绍,就不写了http://www.cnblogs.com/chenpi/p/6475510.html
api测试:
package com.gengsc.buffer; import java.nio.IntBuffer; import java.util.Arrays; import javax.swing.ButtonGroup; /** * @author shichaogeng * * 2017年7月12日 */ public class BufferTest { public static void main(String[] args) { //创建指定长度的缓冲区 IntBuffer buffer = IntBuffer.allocate(10); //使用数组创建缓冲区数组 int[] arr = {1, 3, 5}; //未修改缓冲区之前的数组 System.out.println("未修改缓冲区之前的数组: "); System.out.println(Arrays.toString(arr)); buffer = buffer.wrap(arr); //使用offset buffer = buffer.wrap(arr, 0, 2); //修改元素位置 buffer.put(0, 7); //遍历缓冲区数组 System.out.println("缓冲区数组如下: "); for (int i = 0; i < buffer.limit(); i++) { System.out.println(buffer.get()); } System.out.println("原始数据: "); System.out.println(Arrays.toString(arr)); buffer.clear(); buffer.flip(); System.out.println(buffer); System.out.println(buffer.duplicate()); } }
通道:
通道(channel)用于字节缓冲区与通道另一侧实体(文件或者套接字)有效的传输数据。
两种通道:
File通道 FileChannel
FileChanel只能通过file对象调用getChannel获取
Scoket通道 SocketChannel SocketServerChannel DatagramChannel
通道分为单向(unidirectionnal)和双向(bidirectional)的
实现WritableByteChannel的write方法和实现ReadableByteChannel的read方法,那么它是一个单向通道。
同时实现上述两个接口的类就是双向通道。
通道的阻塞和非阻塞:
非阻塞模式(no-blocking)永远不会让调用的线程休眠。请求操作要么立即返回,要么返回结果表明未进行操作。只有面向流的通道,sockets和pipes才使用非阻塞通道。
以上是关于JavaNIO的主要内容,如果未能解决你的问题,请参考以下文章
Day389.使用JavaNIO实现简易在线多人聊天室 -NIO
Day389.使用JavaNIO实现简易在线多人聊天室 -NIO