Netty学习-01-Nio

来源:互联网 发布:汉密尔顿 知乎 喜剧 编辑:程序博客网 时间:2024/05/24 23:11

(一)Nio介绍

(二)ByteBuffer,FileChannel

(三)DatagramChannel、ServerSocketChannel, 

          SocketChannel

(四)Selector

JavaNIO 由以下几个核心部分组成

Channels

Buffers

Selectors

其他组件:Pipe和FileLock


ChannelBuffer

基本上,所有的 IO NIO 中都从一个Channel开始。Channel有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中。这里有个图示:




Channel的实现

FileChannel

DatagramChannel

SocketChannel

ServerSocketChannel


Buffer实现类

ByteBuffer

CharBuffer

DoubleBuffer

FloatBuffer

IntBuffer

LongBuffer

ShortBuffer


Selector

Selector允许单线程处理多个Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中

这是在一个单线程中使用一个Selector处理3Channel的图示:要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等



(一)ByteBuffer

(二)ByteBufferFileChannel的实战

使用到的类

RandomAccessFile,FileChannel,ByteBuffer

import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.nio.charset.Charset;/** * 主要通过读取文件内容,写到ByteBuffer里,然后再从ByteBuffer对象中获取数据,显示到控制台 * @author chenj * */public class ByteBufferDemo {public static void  readFile(String fileName) {try {RandomAccessFile randomAccessFile = new RandomAccessFile(fileName, "rw");FileChannel fileChannel = randomAccessFile.getChannel();ByteBuffer byteBuffer = ByteBuffer.allocate(10);int size = fileChannel.read(byteBuffer);//将Channel中的内容写到ByteBuffer中while(size>0){byteBuffer.flip();//把ByteBuffer从写模式,转变成读取模式Charset charset = Charset.forName("UTF-8");System.out.println(charset.newDecoder().decode(byteBuffer).toString());byteBuffer.clear();size = fileChannel.read(byteBuffer);}fileChannel.close();randomAccessFile.close();}  catch (Exception e) {e.printStackTrace();}}}


public class ByteBufferTest {@Testpublic void testByteBufferRW() throws Exception{ByteBufferDemo.readFile("file/1.txt");}}





0 0
原创粉丝点击