美文网首页
Java NIO(5) - 通道(2)分散 和 聚集

Java NIO(5) - 通道(2)分散 和 聚集

作者: 21号新秀_邓肯 | 来源:发表于2020-05-15 09:31 被阅读0次

3.9 分散(Scatter) 和 聚集(Gather)

  • 分散读取(Scattering Reads)是指从 Channel 中读取的数据“分散”到多个 Buffer 中。
image.png

注意:按照缓冲区的顺序,从 Channel 中读取的数据依次将 Buffer 填满.

  • 聚集写入(Gathering Writes)是指将多个 Buffer 中的数据“聚集”
    到 Channel
image.png

注意:按照缓冲区的顺序,写入 position 和 limit 之间的数据到 Channel 。

    /**
     * 分散和聚集
     */
    @Test
    public void test04() {
        RandomAccessFile raf1 = null;
        RandomAccessFile raf2 = null;
        FileChannel readChannel = null;
        FileChannel writeChannel = null;
        try {
            raf1 = new RandomAccessFile("1.txt", "rw");
            //1.获取通道
            readChannel = raf1.getChannel();

            //2.分配指定大小的缓冲区
            ByteBuffer bb1 = ByteBuffer.allocate(100);
            ByteBuffer bb2 = ByteBuffer.allocate(1024);

            //3.分散读取
            ByteBuffer[] bbs = {bb1, bb2};
            readChannel.read(bbs);

            for (ByteBuffer bb : bbs) {
                bb.flip();
            }
            System.out.println(new String(bbs[0].array(), 0, bbs[0].limit()));
            System.out.println("----------------------------");
            System.out.println(new String(bbs[1].array(), 0, bbs[1].limit()));

            //4. 聚集写入
            raf2 = new RandomAccessFile("2.txt", "rw");
            writeChannel = raf2.getChannel();
            writeChannel.write(bbs);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (raf1 != null) {
                try {
                    raf1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (raf2 != null) {
                try {
                    raf2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (readChannel != null) {
                try {
                    readChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (writeChannel != null) {
                try {
                    writeChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 字符集
     */
    @Test
    public void test05() {
        Charset cs1 = Charset.forName("GBK");
        //获取编码器
        CharsetEncoder ce = cs1.newEncoder();
        //获取解码器
        CharsetDecoder cd = cs1.newDecoder();

        CharBuffer cb = CharBuffer.allocate(1024);
        cb.put("哈哈");
        cb.flip();
        try {
            //编码
            ByteBuffer bb = ce.encode(cb);

            for (int i = 0; i < cb.length(); i++) {
                System.out.println(bb.get());
            }

            //解码
            bb.flip();
            CharBuffer cb2 = cd.decode(bb);
            System.out.println(cb2.toString());

            Charset cs2 = Charset.forName("GBK");
            System.out.println("------------");
            bb.flip();
            CharBuffer cBuf3 = cs2.decode(bb);
            System.out.println(cBuf3.toString());
        } catch (CharacterCodingException e) {
            e.printStackTrace();
        }
    }

3.10 FileChannel 的常用方法

image.png

相关文章

  • Java NIO(5) - 通道(2)分散 和 聚集

    3.9 分散(Scatter) 和 聚集(Gather) 分散读取(Scattering Reads)是指从 Ch...

  • Java NIO 学习笔记(二)----聚集和分散,通道到通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔...

  • Scatter / Gather

    Java NIO内置了对scatter / gather(分散/聚集)的支持。分散/聚集是在用在从Channel读...

  • NIO-分散/聚集

    分散和聚集 分散/聚集 是使用多个而不是单个缓冲区来保存数据的读写方法。 一个分散的读取就像一个常规通道读取,只不...

  • JAVA NIO 编程入门(三)

    一、前期回顾 上一篇文章JAVA NIO 编程入门(二)学习了NIO的聚集和分散,以及选择器的使用,并通过一个小d...

  • 三.Buffer

    一.Buffer Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓...

  • JAVA基础之NIO

    1、Buffer 1.1 概述 Java NIO中的Buffer用于和NIO通道进行交互,是将数据移进移出通道的唯...

  • JAVA NIO(二)—Buffer

    一、简介     Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓...

  • Java NIO FileChannel

    Java NIO FileChannel Java NIO FileChannel是连接到文件的通道。 使用文件通...

  • Java NIO Selector

    Java NIO Selector Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能...

网友评论

      本文标题:Java NIO(5) - 通道(2)分散 和 聚集

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