java nio 缓冲区(二)

本文章来自于本人个人博客:java nio 缓冲区(二)

一,创建缓冲区

1.缓冲区的创建有两种方式,分别是ByteBuffer.allocate([int])或者ByteBuffer.wrap(byte[]),第一种方式是创建一个分配了int个字节的缓冲区,而第二种方式是在现有字节数组之上创建一个缓冲区,这个缓冲区的capacity就是数组的长度。

2.Buffer类的其它子类创建缓冲区也是一样的:CharBuffer.allocate(int)或者CharBuffer.wrap(byte[])

二,缓冲区复制

缓冲区的复制有两个方法:duplicate()和slice(),duplicate方法会创建一个新的buffer,并且与原始buffer共同指向同一个内存区域;slice()方法是在调用buffer.position(4).limit(21)后调用buffer.slice()将截取缓冲区4-21之间的字节数组。

三,字节缓冲区

1.字节顺序

在缓冲区中,字节顺序被称为大端字节和小端字节。大端字节的意思是将一个数值的字节按照正常的顺序读取方式读入缓冲区,小端字节是讲一个数值的字节按照高位在前地位在后的顺序读进内存,例如:5870099的十进制值为:0x037fb4c7,这是正常顺序,跟我们平常使用的一样,此为大端字节,而如果使用小端字节,则输出将是0xc7b47f03。

四,直接缓冲区

在java中,数组是对象,而数据存储在对象中的方式在不同JVM实现中都各有不同。处于这一原因,引入了直接缓冲区概念。直接缓冲区被用于与佟冬和固有I/O进程交互,他们通过使用固有代码来告知操作系统直接释放或填充内存区域,对用于佟冬直接或原始存取的内存区域中的字节元素的存储尽了最大的努力。

直接字节缓冲区通常是I/O操作最好的选择,在设计方面,它们支持JVM可用的最高效I/O机制,非直接字节缓冲区可以被传递给通道,但是这样可能导致性能损耗。通常非直接缓冲不可能成为一个本地I/O操作目标。如果向一个非直接缓冲中写入数据,则调用方式如下步骤:

1.创建一个临时的直接ByteBuffer对象

2.将非直接缓冲区的内容复制到临时缓冲中

3.使用临时缓冲区执行低层次I/O操作

4.临时缓冲区对象离开作用域,并最终成为被回收的无用数据

从上面的步骤可以知道,非直接缓冲区在读写内存时,是通过一个临时的直接缓冲区的桥接来进行的,但是对于直接缓冲区,每一次的创建都会消耗很大的资源,这无疑加重了程序的负担。

直接缓冲区使用的内存是通过调用本地操作系统方面的代码分配的,绕过了标准JVM堆栈。建立和销毁直接缓冲区会明显比具有堆栈的缓冲区更加破费,这取决于主操作系统以及JVM实现。

直接缓冲区是通过调用ByteBuffer.allocateDirect()方法创建的,注意,用wrap()方法创建的缓冲区总是非直接的。

java nio 缓冲区(二)

时间: 2024-08-12 19:29:09

java nio 缓冲区(二)的相关文章

java nio 通道(二)

本文章来源于我的个人博客: java nio 通道(二) 一,文件通道 文件通道总是堵塞式的,因此不能被置于非堵塞模式. FileChannel对象是线程安全的.多个进程能够在同一个实例上并发调用方法而不会引起不论什么问题,只是非全部的操作都是多线程的.影响通道位置或者影响文件大小的操作都是单线程的. 通过FileChannel实例看到的某个文件的视图同通过一个外部的非java进程看到的该文件的视图可能一致也可能不一致. 创建文件通道: RandomAccessFile randomAccess

java nio 缓冲区(一)

  本文来自于我的个人博客:java nio 缓冲区(一) 我们以Buffer类开始对java.nio包的浏览历程.这些类是java.nio的构造基础.这个系列中,我们将跟随<java NIO>书籍一起深入研究缓冲区,了解各种不同的类型,并学会怎样使用. 一个Buffer对象是固定数量的数据容器.其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索. Buffer类的家谱: 一,缓冲区基础 1.缓冲区的属性: 容量(capacity):缓冲区能够容纳的数据元素的最大数量,这一

Java NIO 缓冲区学习笔记

Buffer其实就是是一个容器对象,它包含一些要写入或者刚读出的数据.在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别.在面向流的I/O中,您将数据直接写入或者将数据直接读到Stream对象中. 在NIO库中,所有数据都是用缓冲区处理的.在读取数据时,它是直接读到缓冲区中的.在写入数据时,它是写入到缓冲区中的.任何时候访问NIO中的数据,您都是将它放到缓冲区中. 缓冲区实质上是一个数组.通常它是一个字节数组,但是也可以使用其他种类的数组.但是一个缓冲区不仅仅是一个数组.缓冲区提

Java NIO (二) 缓冲区(Buffer)

缓冲区(Buffer):一个用于特定基本数据类型的容器,由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的Buffer 主要用于和NIO中的通道(Channel)进行交互, 数据从通道(Channel)读入缓冲区(Buffer)或者从缓冲区(Buffer)写入通道(Channel).如下,我画的一个简图,Chanenl直接和数据源或者目的位置接触,Buffer作为中介这,从一个Channel中读取数据,然后将数据写入另一个Channel中. Bu

Java NIO -- 缓冲区(Buffer)的数据存取

缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的. Buffer 就像一个数组,可以保存多个相同类型的数据.根据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:ByteBufferCharBuffer ShortBuffer IntBuffer LongBuffer Flo

Java NIO系列(二) - Buffer

前言 在Java NIO中,缓冲区用来临时存储数据,可以理解为是I/O操作中数据暂存的中转站.缓冲区直接为通道(Channel)服务,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问这块内存. 正文 Buffer的类型 Java NIO提供以下几种Buffer类型: ByteBuffer MappedByteBuffer ShortBuffer LongBuff

Java NIO 缓冲区

Java NIO 在JDK1.4的时候引入,主要解决传统IO的一些性能问题.NIO 主要内容包含 Buffer .Channel.Selector等内容,本文主要讲解Buffer相关的内容. Buffer的继承体系 Buffer的子类比较多,但是继承关系比较简单.8种基本类型,除了布尔类型,其余的类型都有对应的Buffer实现,名字也十分好记:基本数据类型首字母大写+Buffer.其中ByteBuffer最为常用,因为字节是操作系统及其I/O设备使用的基本数据类型,后面演示的时候也主要使用字节缓

Java NIO(二)

通道之间的数据传输 在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFrom() FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中).下面是一个简单的例子: Java代码  1.  RandomAccessFi

Java-杂项-java.nio:java.nio

ylbtech-Java-杂项-java.nio:java.nio java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络. 1.返回顶部 1. 中文名:java非阻塞式IO 外文名:java nio 缓冲区:数据容器 特    性:Channel,Buffer,Selector 简    称:nio 目    的:提供非阻