美文网首页
4.NIO发散汇聚与编码解码

4.NIO发散汇聚与编码解码

作者: xialedoucaicai | 来源:发表于2018-05-15 16:18 被阅读0次

发散汇聚:一次性将数据写入到多个缓冲区,一次性从多个缓冲区读出数据

许多操作系统能把组装/分解过程进行得更加高效。根据发散/汇聚的概念,进程只需一个系统调用,就能把一连串缓冲区地址传递给操作系统。然后,内核就可以顺序填充或排干多个缓冲区,读的时候就把数据发散到多个用户空间缓冲区,写的时候再从多个缓冲区把数据汇聚起来。

三个缓冲区的发散读操作 这样用户进程就不必多次执行系统调用(那样做可能代价不菲),内核也可以优化数据的处理过程,因为它已掌握待传输数据的全部信息。如果系统配有多个 CPU,甚至可以同时填充或排干多个缓冲区。

看代码:

public void testChannel4() throws IOException{
    //这里使用FileInputStream也可以实现
    RandomAccessFile raf = new RandomAccessFile("1.txt", "r");
    FileChannel channel = raf.getChannel();
    
    //聚集和分散:对多个缓冲区操作
    ByteBuffer bf1 = ByteBuffer.allocate(100);
    ByteBuffer bf2 = ByteBuffer.allocate(1024);
    ByteBuffer [] bfs = {bf1,bf2};
    
    //写入多个缓冲区
    channel.read(bfs);
    
    //验证下文件内容是否被写入两个buffer了
    for (ByteBuffer bf : bfs) {
        //注意,非直接缓冲区操作读写切换,需要调用flip,否则会出问题
        bf.flip();
        System.out.println(new String(bf.array()));
    }
    
    //这里使用FileOutputStream也可以实现
    RandomAccessFile raf2 = new RandomAccessFile("2.txt", "rw");
    FileChannel channel2 = raf2.getChannel();
    channel2.write(bfs);
    
    raf2.close();
    raf.close();
}

编码解码:主要是网络传输可能会用到,防止乱码,本地因为我是中文Windows系统,应该默认会取OS的编码,所以中文也不会乱码。
看代码:

public void testChannel5() throws CharacterCodingException{
    //支持的字符编码
    /*SortedMap<String, Charset> availableCharsets = Charset.availableCharsets();
    for(Entry<String,Charset> entry : availableCharsets.entrySet()){
        System.out.println(entry.getKey()+" "+entry.getValue());
    }*/
    
    Charset charset = Charset.forName("UTF-8");
    //编码器
    CharsetEncoder encoder = charset.newEncoder();
    CharBuffer charBuffer = CharBuffer.allocate(100);
    charBuffer.put("我是中文");
    charBuffer.flip();
    ByteBuffer byteBuffer = encoder.encode(charBuffer);
    for(byte b :byteBuffer.array()){
        System.out.println(b);
    }
    
    //解码器
    CharsetDecoder decoder = charset.newDecoder();
    CharBuffer charBuffer2 = decoder.decode(byteBuffer);
    System.out.println(charBuffer2.array());    
}

相关文章

网友评论

      本文标题:4.NIO发散汇聚与编码解码

      本文链接:https://www.haomeiwen.com/subject/uyfedftx.html