Java.nio.Buffer 是用于特定的基本类型数据(每个非 boolean 基本类型都存在此类的一个子类)的容器(缓冲区),缓冲区是特定的基本类型元素的线性、有限序列。
缓冲区的基本属性除其内容外还包括容量、限制和位置:
缓冲区的容量 capacity() 是它所包含的元素的数量。缓冲区的容量永远不会为负并且从不会更改;
缓冲区的限制 limit() 是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会大于其容量;
缓冲区的位置 position(int newPosition) 是下一个要读取或写入的元素的索引。缓冲区的位置永远不会为负,并且永远不会大于其限制。
在初始状态下,缓冲区的limit和capacity值相同。但limit和capacity的区别是limit可以通过limit方法进行设置,而capacity在创建缓冲区时就已经指定了,并且不能改变。
如果position的值等于limit,就不能访问缓冲区的当前数据,也就是说不能使用get和put方法。否则将抛出 BufferOverflowException异常。由于使用allocate创建的缓冲区并不是一次性地分配内存空间,因此,可以将缓冲区的 capacity设为很大的值,如10M。缓冲区过大可能在某些环境中会使系统性能降低(如在PDA或智能插秧机中),因此,可以使用limit方法根据具体的情况来限定缓冲区的大小。当然,limit还可以表示缓冲区中实际的数据量。
nio.Buffer的3个方法:清除、反转和重绕
下面用几个例子展示nio.Buffer
import java.nio.IntBuffer;
public class InetBuferTest2 {
public static void main(String[] args) {
IntBuffer buf = IntBuffer.allocate(8);
for(int i = 1 ; i <= 8 ; i++){
buf.put(i);
}
System.out.println(buf.position()+ " " + buf.limit());
//重新设置position
/*buf.position(1);
buf.limit(5);
for(int i = 1; i < 5 ; i++){
//int temp = buf.get();
buf.put(10+3);
}
System.out.println(buf.get(1));
buf.flip();
while(buf.hasRemaining()){
System.out.print(buf.get()+" ");
}*/
//设置子缓冲区
buf.position(2);
buf.limit(6);
IntBuffer sbuf = buf.slice();//设置子缓冲区
while(buf.hasRemaining()){
System.out.println(buf.get());
sbuf.put(10);
}
System.out.println(buf.position() + " " + buf.limit());
buf.flip();//position = 0 但是limit是上次的position 值为2 如果你想全部遍历那么需要把limit设置为最大容量的值
buf.limit(buf.capacity());
System.out.println(buf.position() + " " + buf.limit());
while(buf.hasRemaining()){
System.out.println(buf.get());
}
}
}
===================================================
//构造一个只读缓冲区
import java.nio.IntBuffer;
public class InetBufferTest3 {
public static void main(String[] args) {
IntBuffer buf = IntBuffer.allocate(8);
for(int i = 1 ; i <= 8 ; i++){
buf.put(i);
}
IntBuffer readonly = buf.asReadOnlyBuffer(); //构造了一个只读缓冲区
readonly.position(0); // 或者 readonly.flip();
while(readonly.hasRemaining()){
System.out.println(readonly.get());
}
}
}
===============================================
import java.nio.IntBuffer;
public class IntBufferTest1 {
public static void main(String[] args) {
IntBuffer buf = IntBuffer.allocate(8);
System.out.println(buf.position() +" "+ buf.limit() + " " + buf.capacity()); //输出结果:0 8 8
buf.put(1);
System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity()); //输出结果:1 8 8
//通过get方法去取其中的每一个元素
System.out.println(buf.get(0)); //输出结果:1
System.out.println(buf.get(1)); //输出结果:0,还没有为第2个元素赋值,说明它的所有元素初始值为0
//直接放一个数组
buf.put(new int[]{2,3,4});
System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity());
//用以下方式去取出已经填充值的元素
buf.flip();//position变为0 limit变为上次的position
System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity());
//hasRemaining 遍历position--->limit
while(buf.hasRemaining())
{
System.out.print(buf.get()+” “); //输出结果:1 2 3 4
}
}
}
相关推荐
根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...
Java.nio引入了通道(Channel)和缓冲区(Buffer)的概念。通道代表I/O操作的来源或目的地,如文件、套接字等;缓冲区则用于临时存储数据,提供了一种更有效的方式进行数据传输。NIO的核心组件还包括选择器...
### Java.NIO网络编程入门详解 #### Java.NIO概述 Java.NIO,即Non-blocking I/O,是Java从1.4版本开始引入的一种新的输入输出处理方式,它为Java程序员提供了更为高效的数据处理机制。传统的Java IO(Blocking IO...
总的来说,Java NIO API提供了一种更加高效、灵活的I/O编程模型,它通过Buffer、Channel和Selector这三个核心组件,实现了数据的缓冲和异步传输,极大地提升了Java在处理I/O操作时的性能和并发能力。开发者可以根据...
System.out.print((char) buffer.get()); } // 清空buffer以便再次使用 buffer.clear(); ``` ##### Selector操作示例 ```java // 创建一个Selector Selector selector = Selector.open(); // 打开一个...
此外,还有三个函数buffer-seq,buffer-nth和buffer-to-array,旨在使将java.nio类集成到Clojure中更加容易。 希望通过将它们的功能滚动到clojure.core中,它们将变得过时。 要使其他功能与ByteBuffers一起使用,还...
缓冲区类型包括ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,它们都继承自`java.nio.Buffer`。 3. **选择器(Selector)**:用于监听多个通道的事件(如连接就绪、数据到达等),当某个通道准备好进行读写...
Java NIO,全称为New Input/Output,是Java在1.4版本引入的一个新的I/O API,用于替代标准的Java IO API。这个新的API提供了一种不同于传统阻塞I/O模型的非阻塞I/O处理方式,使得在处理高并发、大数据传输场景时性能...
FloatBuffer是Java NIO中的一种Buffer类型,用于存储浮点数。它继承自ByteBuffer,并提供了对浮点数读写的支持。`UseFloatBuffer.java`可能包含如何分配、填充、反转、清理和获取浮点数的示例代码。在处理大量浮点数...
Java NIO提供了一系列Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,它们都继承自抽象类Buffer。 - **选择器(Selectors)**:选择器允许单线程处理多个通道,通过注册感兴趣的事件(如读、写、连接和接受)并...
Java NIO,全称为New Input/Output,是Java 1.4版本引入的一套全新的I/O API,旨在提高I/O操作的效率和灵活性。相比于传统的IO流,NIO提供了许多新特性,使得开发者能以更加高效的方式处理输入/输出。 1. **内存...
buffer.clear(); } } } catch (IOException e) { // 错误处理 } } } } // ... 主函数和其他辅助方法 } ``` 【常见问题与解决策略】 1. **CPU占用过高**:当注册了不必要的事件(如无数据可写时注册了写...
- `buffer.flip()`将缓冲区从写模式切换到读模式,以便可以读取之前写入的数据。 - `buffer.get()`获取并移除缓冲区中的一个字节,将其转换为字符并打印。 - `buffer.clear()`清空缓冲区,以便下次读取。 三、NIO读...
而Java NIO引入了Channel(通道)和Buffer(缓冲区)的概念,以及Selector(选择器)机制,使得一个线程可以同时监控多个通道的事件,大大提高了处理效率。以下是NIO的主要组件和特性: 1. **Channel**:类似于流,...
java.nio 中定义了 Buffer 及其数据类型相关的子类,而 java.nio.channels 中定义了一系列处理 IO 的 Channel 接口以及这些接口在文件系统和网络通讯上的实现。通过 Selector 这个类,还提供了进行非阻塞 IO 操作的...
在JDK 1.6的源码中,你可以深入理解这些概念的实现细节,例如`java.nio`包下的各种类和接口,以及`sun.nio`包中的实现类,这些都是NIO核心功能的实现。`launcher`可能是JVM的启动器,`org`、`javax`、`java`、`com`...
1. **`java.nio`**: 定义了各种类型的缓冲区(Buffer),包括`ByteBuffer`、`CharBuffer`等。 2. **`java.nio.channels`**: 提供了一系列通道(Channel)接口及其具体实现,支持文件和网络的I/O操作。 3. **`java.nio....
buffer.flip(); // 准备解码 // 自定义字符集识别逻辑 for (String charsetName : getPossibleCharsets()) { Charset charset = Charset.forName(charsetName); CharsetDecoder decoder = charset.newDecoder...