Java NIO缓冲

缓冲区(buffer)是从即将写入通道(channel)或刚刚从通道中读出的一段数据。它是一个持有数据,并扮演NIO通道端点的对象。缓冲区为数据访问和读写过程提供正式机制。

它是NIO和老版Java I/O的一个主要区别。之前数据是直接从流(stream)中读写的,现在数据可以从缓冲区读写。在NIO中,通道是流的同义词。想要了解更多关于NIO通道的信息, 请阅读上一篇教程Java NIO通道

NIO缓冲区特征

  • Java NIO的基本组成模块就是缓冲区。
  • 缓冲区提供一个固定大小的容器来读取数据。
  • 每个缓冲区都是可读的,但只有特定缓冲区才是可写的。
  • 缓冲区是通道的端点。
  • 只读缓冲区的内容是不可变的,但是其mark、position和limit都是可变的。
  • 默认情况下,缓冲区都不是线程安全的。

缓冲区类型

每种原始类型都有一个对应的缓冲区类型。所有的缓冲区类都实现了Buffer接口。最常用的缓冲区类型是ByteBuffer。如下是Java NIO包中提供的缓冲区类型。

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • MappedByteBuffer

缓冲区容量

缓冲区有固定大小,我们只能存储少于“固定大小”的数据,固定大小的值就叫做缓冲区的容量。缓冲区一旦填满则必须清空才能再次写入。容量一旦设置好,在缓存区的生命周期内都不会改变。

缓冲区界限

在写入模式,缓冲区的界限就等于容量。在读模式中,界限指向缓冲区最后一个数据位的下一位。当缓冲区被写入时,界限一直递增。缓冲区的界限永远大于等于零且小于等于容量,0 <= 界限 <= 容量。

缓冲区位置

位置指向缓冲区当前地址。当缓冲区创建时,位置设置为零。读写过程中,位置会递增到下一个索引位置。位置永远在零和界限之间。

缓冲区标记

标记类似于给缓冲区设置书签。调用 mark() 时当前位置就被记录下来了,调用 reset() 时标记的位置就被恢复。

缓冲区flip、clear和rewind

缓冲区flip()

flip() 方法用来为缓冲区做准备,进行 get 操作或者准备新的写入序列。flip() 将界限设置到当前位置,然后将位置置为0。

缓冲区clear()

clear() 方法用来为缓冲区做准备,进行 put 操作或者准备新的读序列。clear() 将界限设置到容量的位置,并将位置置为0。

缓冲区rewind()

rewind() 方法用来再次读取已经获取过的数据。rewind()将缓冲区位置置0。

如何读NIO缓冲区

  1. 首先创建缓冲区,分配容量。Buffer有一个 allocate(size) 方法,可以返回一个 Buffer 对象。ByteBuffer byteBuffer = ByteBuffer.allocate(512);
  2. 进行 flip 操作,准备进行读操作。byteBuffer.flip();
  3. 下面可以读入数据。int numberOfBytes = fileChannel.read(byteBuffer);
  4. 接下来可以从缓冲区读取数据。char c = (char)byteBuffer.get();

如何写NIO缓冲区

  1. 创建缓冲区,分配容量。ByteBuffer byteBuffer = ByteBuffer.allocate(512); //容量设为512
  2. 写入数据。byteBuffer.put((byte) 0xff);

以上就是读写缓冲区的两个例子。缓冲区有很多种类型以及很多种读写方法。你可以根据使用要求进行选择。

时间: 2024-11-05 14:57:06

Java NIO缓冲的相关文章

Java NIO 缓冲技术详解

缓冲区(buffer)是从即将写入通道(channel)或刚刚从通道中读出的一段数据.它是一个持有数据,并扮演NIO通道端点的对象.缓冲区为数据访问和读写过程提供正式机制. 它是NIO和老版Java I/O的一个主要区别.之前数据是直接从流(stream)中读写的,现在数据可以从缓冲区读写.在NIO中,通道是流的同义词.想要了解更多关于NIO通道的信息, 请阅读上一篇教程Java NIO通道. NIO缓冲区特征 Java NIO的基本组成模块就是缓冲区. 缓冲区提供一个固定大小的容器来读取数据.

Java NIO之缓冲

一.前言 在笔者打算学习Netty框架时,发现很有必要先学习NIO,因此便有了本博文,首先介绍的是NIO中的缓冲. 二.缓冲 2.1 层次结构图 除了布尔类型外,其他基本类型都有相对应的缓冲区类,其继承关系层次图如下. 其中,Buffer是所有类的父类,Buffer中也规定了所有缓冲区的共同行为. 2.2 缓冲区基础 缓冲区是包在一个对象内的基本数据元素数组,其有四个重要属性 容量( Capacity):缓冲区能够容纳的数据元素的最大数量,容量在缓冲区创建时被设定,并且永远不能被改变. 上界(L

Java NIO中的缓冲区Buffer(一)缓冲区基础

什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的源码),Buffer类内部其实就是一个基本数据类型的数组,以及对这个缓冲数组的各种操作: 常见的缓冲区如ByteBuffer.IntBuffer.DoubleBuffer...内部对应的数组依次是byte.int.double... 与通道的关系 在Java NIO中,缓冲区主要是跟通道(Chann

JAVA NIO 内存映射(转载)

原文地址:http://blog.csdn.net/fcbayernmunchen/article/details/8635427 Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当

Java NIO (二) 缓冲区(Buffer)

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

[转载] Java NIO与IO

原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代码设计. Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分

Java NIO 系列教程(转)

原文中说了最重要的3个概念,Channel 通道Buffer 缓冲区Selector 选择器其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵塞模式才加入的东西.以前的流总是堵塞的,一个线程只要对它进行操作,其它操作就会被堵塞,也就相当于水管没有阀门,你伸手接水的时候,不管水到了没有,你就都只能耗在接水(流)上.nio的Channel的加入,相当于增加了水龙头(有阀门),虽然一个时刻也只能接一个水管的水,但依赖轮换策略,在水量不大的时候,各

java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高.NIO最主要的就是实现了对异步操作的支持.其中一种通过把一个套接字通道(SocketChannel)注册到一个选择器(Selector)中,不时调用后者的选择(select)方法就能返回满足的选择键(SelectionKey

Java NIO 系列教程

转载于http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO.感谢并发编程网的翻译和投递. (关注ITeye官微,随时随地查看最新开发资讯.技术文章.) Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流