selector
是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel通道的状态是否处于可读、可写。如此可以实现单线程管理多个channels也就是可以管理多个网络链接。使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销
- FileChannel不能切换为非阻塞模式,更准确的来说是因为FileChannel没有继承 SelectableChannel
- 多用于网络应用编程中
基本用法
- Selector的创建。通过调用Selector.open()方法创建一个Selector对象 Selector selector = Selector.open();
- 注册Channel到Selector
channel.configureBlocking(false);SelectionKey key = channel.register(selector, Selectionkey.OP_READ); 轮询方式获取选择器上的状态值while(selector.select()>0){Iterator<SelectionKey> it=selector.selectedKeys().iterator();...}
ChatSet字符集
所有文件在底层都是二进制文件,字符文件是系统将底层的二进制序列转换为字符,这里会涉及编码Encoder和解码Decoder
- 将明文的字符序列转换为计算机理解的二进制序列称为编码
- 将二进制序列转换为明文字符串称为解码
Charset类
- availableCharsets():SortedMap<String,Charset> 获取当前JDK所支持的所有字符集
- 字符串别名
- UTF-8是8位UCS转换格式
- ISO-8859-1拉丁文
- GBK简体中文 Charset c=Charset.forName("GBK");
Java7新增StandardCharsets类,其中包含了ISO_8859_1、UTF_8、UTF-16等类变量,这些类变量代表了最常见的字符集对应的Charset对象
- newDecoder():CharsetDecoder获取该编码字符集对应的解码器
- decode(ByteBuffer):CharBuffer方法可以将字节序列ByteBuffer转换为CharBuffer字符序列
- newEncoder():CharsetEncoder获取该编码字符集对应的编码器
- encode(CharBuffer):ByteBuffer方法可以将字符序列CharBuffer转换为ByteBuffer字节序列
Charset c1 = Charset.forName("GBK");CharsetEncoder encoder = c1.newEncoder();CharsetDecoder decoder = c1.newDecoder();CharBuffer cb = CharBuffer.allocate(8);cb.put('孙');cb.put('误');cb.put('空');cb.flip();ByteBuffer bb=encoder.encode(cb);//将CharBuffer转换为ByteBufferfor(int i=0;i<6;i++) {System.out.println(bb.get(i)+" ");}System.out.println("====================");System.out.println(decoder.decode(bb));//将byteBuffer转换为charBuffer