网络编程--NIO--Buffer

参考:https://www.cnblogs.com/ostenant/p/9695177.html

在Java NIO中,缓冲区用来临时存储数据,可以理解为是I/O操作中数据暂存的中转站。缓冲区直接为通道(Channel)服务,数据是从通道读入缓冲区,从缓冲区写入到通道中的。

缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问这块内存。

Buffer的类型

Java NIO提供以下几种Buffer类型:

  • ByteBuffer
  • MappedByteBuffer
  • ShortBuffer
  • LongBuffer
  • FloatBuffer
  • CharBuffer
  • IntBuffer
  • DoubleBuffer
    这些Buffer类型代表了Java中7种基本数据类型。换句话说,就是可以通过byte、char、short、int、long、float或double类型来操作缓冲区中的数据。

Buffer的基本用法

使用Buffer读写数据一般遵循以下四个步骤:

  1. 写入数据到Buffer中;
  2. 调用Buffer的flip()方法;
  3. 从Buffer中读取数据;
  4. 调用clear()方法或者compact()方法。

当向Buffer写入数据时,Buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到Buffer的所有数据。

一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。两种方式能清空缓冲区:调用clear()或compact()方法。

clear()方法:清空整个缓冲区,包括已读和未读的数据。

compact()方法:只会清空已读的数据,未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

下面给出一个ByteBuffer的简单使用示例,其他缓冲区API的使用类似:

package com.example.dtest.nio.buffer;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class BufferTest01 {

    public static void main(String[] args) {

        testReadFromBuffer();

    }

    public static void testReadFromBuffer(){

        try {
            RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\test.txt", "rw");
            FileChannel fileChannel = randomAccessFile.getChannel();
            StringBuilder stringBuilder = new StringBuilder();
//            创建容量为10byte的buffer
            ByteBuffer byteBuffer = ByteBuffer.allocate(10);
//          不断地写入缓冲区,写一次读一次
            while (fileChannel.read(byteBuffer) != -1){
//                设置buffer切换模式为读模式
                byteBuffer.flip();
                while (byteBuffer.hasRemaining()){
//                    每次读取1byte,也就是1字节
//                    System.out.println((char) byteBuffer.get());
                   stringBuilder.append((char) byteBuffer.get());
                }
//                清空整个缓冲区,准备下次写入
                byteBuffer.clear();

            }
            System.out.println(stringBuilder.toString());
            fileChannel.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }


    }

}

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值