Java NIO之缓冲区

Wesley13
• 阅读 689

Java NIO之Buffer

  Java传统的I/O模型是面向单个字节的,它将输入输出抽象为字节流或字符流。这种单个字节的读取或写入模型的效率比较低,而且不符合操作系统的I/O特点。操作系统的IO是面向字节块的,通常是直接从磁盘中读取一块数据到内存或写入一块数据到磁盘。Java NIO提供了缓冲区来实现字节块的读写。

  Buffer内部管理着一个数组,数据存放在数组中。Buffer作为数据的载体,Java程序在使用NIO时都会通过Buffer与外界进行通信。

一.缓冲区的类别

 Java NIO之缓冲区

如上图所示,除了boolean类型外,Java为其他七种基本类型提供了相应的Buffer。这七种Buffer中,ByteBuffer是最基本的Buffer,其他的类的Buffer可以通过ByteBuffer转换得到。而且在使用通道对外传输数据时,要求必须是ByteBuffer。

二.缓冲区的四种属性

1.capacity

容量表示缓冲的大小,其实就是缓冲区内部数组的大小。

2.position

  位置表示缓冲区中当前可读写位置。当调用get()、put()等函数进行读写时,会自动更新position。

3.limit

  limit表示缓冲区中可用元素的大小。当写缓冲区时,limit等于capacity,表示整个缓冲区都可写。当读缓冲区时,limit是缓冲区中已有元素的大小,表示读取缓冲区的位置不能超过limit。

4.mark

  mark是备忘位置,可以暂时存储position,以便position改变后可以恢复到原来的位置。

三、Buffer的API

Java NIO之缓冲区

  1. capacity()返回缓冲区的容量。
  2. position()返回当前的位置,而position(int)可以设置新的位置,如果给定的参数超过了limit或小于0,会抛出IllegalArgumentException,另外position小于mark,会把mark置为-1,因此在缓冲区使用过程中会一直保持mark<=position<=limit。
  3. limit()直接返回limit属性值。
  4. limit(int)会设置新的limit值,如果新的limit超过了capacity会抛出IllegalArgumentException,如果小于position,则会把position设置为limit,如果小于mark,则mark设为无效值-1。
  5. mark()方法会把当前position记录到mark属性,而reset()方法会把position值设置为mark。
  6. clear()将Buffer置为初始状态,position置为0,limit设置为capacity,mark设置为-1。通常在写入数据之前需要调用该方法。
  7. flip()表面意思是“翻转”,生动的描述了Buffer从写状态进入读状态,该方法会将limit设置为position,同时position设置为0,mark置为-1。
  8. rewind()方法将position设置为0,以便能重头开始读写数据。
  9. remaining()返回缓冲区剩余元素的大小,limit-position。hashRemaining()表示缓冲区是否还有剩余元素。

四.Buffer的读写

ByteBuffer的读数据API如下:

Java NIO之缓冲区

Buffer类没有读写相关的API,其各个子类中才有相应的API,这是因为Buffer的子类存储的类型各不相同,不能作为公共API放到Buffer中。在ByteBuffer中有四种方法可以读取数据:

  1. get()从当前位置获取一个字节,并将position移动到下一个位置。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
javaIO2
NIO新的输入/输出(NIO)库是在JDK1.4中引入的,弥补了原来的I/O的不足,提供了高速的、面向块的I/O。1.1流与块I/O与NIO最重要的区别是数据打包和传输的方式,I/O以流的方式处理数据,而NIO以块的方式处理数据。面向流的I/O一次处理一个字节数据:一个输入流产生一个字
Wesley13 Wesley13
3年前
Java NIO —— Buffer(缓冲区)
Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区。注意:Buffer是非线程安全类。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIOBuffer对象,并提供了一组方法,用来方便的访问该块内存。NIO有以下几种Buffer类型:ByteBufferMappedByteBuff
Wesley13 Wesley13
3年前
NIO入门
1、I/O输入输出,所有的IO都被视作是单个字节的移动,通过stream对象一次移动一个字节。流IO负责把对象转换为字节,然后再转换为对象。NIO提供了二套NIO,一套是针对标准输入输出NIO,另一套是网络编程NIO2、流与块的比较NIO和IO最大的区别是数据打包和传输方式,IO是以流的方式来处理数据,而NIO是以块的方式处理数据。面向块的IO
Wesley13 Wesley13
3年前
JAVA NIO(一)
1NIO概述1.1NIO(newIO)是一个可以替代javaIOAPI的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVANIO的几个核心组成部分是channels,Buf
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_