Java NIO 系列教程(三)

分散读取和聚集写入

  • 分散读取:就是将通道中的数据分散读取到多个缓冲区中

这里写图片描述

  • 聚集写入:就是将多个缓冲区中的数据聚集写入到通道中
    这里写图片描述

分散读取具体实现:

private static void test2() {

        RandomAccessFile ras = null;

        try {
            ras = new RandomAccessFile("doc", "rw");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        FileChannel fic = ras.getChannel();
        ByteBuffer buf1 = ByteBuffer.allocate(1);
        ByteBuffer buf2 = ByteBuffer.allocate(1);
        ByteBuffer[] bufs = { buf1, buf2 };
        try {
            fic.read(bufs);
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (ByteBuffer buf : bufs) {
            /**
             * 改变写模式为读模式 在Buffer中进行的操作为: limit = position position = 0;
             */
            buf.flip();
        }

        System.out.println(new String(bufs[0].array(), 0, bufs[0].limit()));
        System.out.println(new String(bufs[1].array(), 0, bufs[1].limit()));
    }

输出结果为: a b

聚集写入具体实现:

try {
            ras = new RandomAccessFile("doc2", "rw");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        FileChannel fon  = ras.getChannel();
        try {
            fon.write(bufs);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

聚集写入完成。

字符集

编码:字符串转变为字节数组

解码:字节数组转变为字符串

观察Java CharSet支持的字符集:

Map<String, Charset> map = Charset.availableCharsets();
        Set<Entry<String, Charset>> set = map.entrySet();
        for (Entry<String, Charset> entry : set) {
            System.out.println(entry.getKey() + "..." + entry.getValue());
        }

输出结果为:

Big5...Big5
Big5-HKSCS...Big5-HKSCS
CESU-8...CESU-8
GB18030...GB18030
GB2312...GB2312CN
ISO-2022-JP...ISO-2022-JP
ISO-2022-JP-2...ISO-2022-JP-2
ISO-2022-KR...ISO-2022-KR
ISO-8859-1...ISO-8859-1
ISO-8859-9...ISO-8859-9
......

加密与解密:

Charset charSet = Charset.forName("GBK");
        // 获取编码器
        CharsetEncoder enchar = charSet.newEncoder();
        // 获取解码器
        CharsetDecoder dechar = charSet.newDecoder();

        CharBuffer cbuf = CharBuffer.allocate(1024);
        cbuf.put("张强");
        cbuf.flip();
        // 编码
        ByteBuffer bbuf = ByteBuffer.allocate(2014);

        try {
            bbuf = enchar.encode(cbuf);
        } catch (CharacterCodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        for(int i =0;i<bbuf.limit();i++)
        System.out.println(bbuf.get());
        bbuf.clear();
        try {
            CharBuffer cbf = dechar.decode(bbuf);
            System.out.println(cbf.toString());
        } catch (CharacterCodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NobiGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值