在基本IO操作中所有操作都是直接已流的形式完成的,而在NIO中所有的操作都要使用缓存区处理,且所有的读写操作都是通过缓存区完成的。缓存区(Buffer)是一个线性的、有序的数据集,只能容纳某种特定的数据类型
Buffer的基本操作
java.nio.Buffer是一个抽象类,常见方法如下
public final int capacity() |
返回此缓存区的容量 |
public final int limit() |
返回此缓存区的限制 |
public final Buffer limit(int newLimit) |
设置此缓存区的限制 |
public final int position() |
返回缓存区的操作位置 |
public final Buffer flip() |
重设缓存区,在写入之前调用,改变缓冲的指针 |
public final boolean hasRemaining() |
判断当前位置和限制之间是否有内容 |
各种数据类型的缓冲区类
java.nio.ByteBuffer |
存储字节的Buffer |
java.nio.IntBuffer |
储存整形的Buffer |
更多参考api
演示缓冲区的操作
import java.nio.IntBuffer; public class IntBufferDemo01 { /** * @param args */ public static void main(String[] args) { IntBuffer buf = IntBuffer.allocate(10); System.out.println("1、写入数据之前的position、limit和capacity"); System.out.println(buf.position()+","+buf.limit()+","+buf.capacity()); int[] temp ={1,3,5}; buf.put(2); buf.put(temp); System.out.println("2、写入数据之后的position、limit和capacity"); System.out.println(buf.position()+","+buf.limit()+","+buf.capacity()); buf.flip(); //重设缓冲区 limit设置为position,position设置为0 System.out.println("3、准备输出数据时的position、limit和capacity"); System.out.println(buf.position()+","+buf.limit()+","+buf.capacity()); System.out.println("缓冲区的内容:"); while(buf.hasRemaining()){ int x = buf.get(); System.out.print(x+"、"); } } }
输出:
1、写入数据之前的position、limit和capacity 0,10,10 2、写入数据之后的position、limit和capacity 4,10,10 3、准备输出数据时的position、limit和capacity 0,4,10 缓冲区的内容: 2、1、3、5、
创建子缓冲区
可以使用各个缓冲区的类的slice()方法从一个缓冲区中创建一个新的子缓冲区,子缓冲区与原缓冲区中的各个部分数据可以共享
import java.nio.IntBuffer; public class IntBufferDemo02 { /** * @param args */ public static void main(String[] args) { IntBuffer buf = IntBuffer.allocate(10); IntBuffer sub = null; for (int i = 0; i < 10; i++) { buf.put(2*i+1); } buf.position(2); buf.limit(6); sub = buf.slice(); for (int i = 0; i < sub.capacity(); i++) { int temp = sub.get(i); sub.put(temp-1); } buf.flip(); buf.limit(buf.capacity()); System.out.println("主缓存区中的内容"); while(buf.hasRemaining()){ int x = buf.get(); System.out.print(x+"、"); } } }
输出:
主缓存区中的内容 1、3、4、6、8、10、13、15、17、19、
创建直接缓冲区
在缓冲区操作类中,只有ByteBuffer可以创建直接缓冲区,使用直接缓冲区的时候,JVM虚拟机会直接在此缓冲区上执行 本机IO操作,也就是说,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会避免将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容)。
创建直接缓冲区方法如下:
public static ByteBuffer allocateDirect(int capacity)
import java.nio.ByteBuffer; public class ByteBufferDemo01 { /** * @param args */ public static void main(String[] args) { ByteBuffer buf = null; buf = ByteBuffer.allocate(10); byte[] temp ={1,3,5,7,9}; buf.put(temp); buf.flip(); System.out.println("缓冲区的内容:"); while(buf.hasRemaining()){ int x = buf.get(); System.out.print(x+"、"); } } }
输出:
缓冲区的内容: 1、3、5、7、9、
相关推荐
#### 二、Buffer & Channel(缓冲区与通道) **Buffer** 和 **Channel** 是NIO中的两个核心概念。 1. **Buffer是什么?** - **定义**:`Buffer`是一个包含数据的对象,用于读写操作。在NIO中,所有数据的读写都...
### JAVANIO简介 #### 一、基本概念与传统IO 在计算机科学领域中,**IO(Input/Output)**是指主存与外部设备(如硬盘、终端、网络等)之间传输数据的过程。它是操作系统的一项核心功能,通过专用的I/O指令来实现。...
### Java读取大文件技术详解 #### 一、引言 在Java开发中,处理大文件是一项常见的任务,尤其在数据分析、日志处理等领域尤为重要。本文将深入探讨如何使用Java来高效地读取大文件,并提供一个具体的示例代码进行...
控制默认行为涵盖了一系列的选项,例如Keep-Alive、发送和接收缓存区大小等。关闭连接的方法和Applets(小程序)也是进阶内容的一部分。 8. NIO(New Input/Output) NIO是一种可以替代传统I/O的新的I/O编程模式,...
- **控制默认行为**:可以根据具体需求调整套接字的行为,如启用Keep-Alive选项、调整发送和接收缓存区的大小等。 #### 9. NIO(New IO) - **为什么需要NIO**:传统的IO模型在处理大量连接时效率较低,NIO提供了...
### Java+TCPIP+Socket编程(中文版) —— 关键知识点详解 #### 第1章 简介 - **计算机网络、分组报文和协议** 计算机网络是通过通信设备和线路将地理位置分散、功能独立的多个计算机系统互连起来,以功能完善的...
NIO(New IO)是从Java 1.4版本开始提供的新的IO API,它提供了基于通道(channel)和缓冲区(buffer)的模型,支持面向块的IO操作,从而提高了性能。NIO还引入了选择器(selector),可以有效地支持多路复用的非阻塞IO操作...
- **NIO (New IO)**:引入了通道(Channel)和缓冲区(Buffer)的概念,支持非阻塞模式,可以显著提升文件读写的效率。 - **异步IO**:支持在不阻塞当前线程的情况下进行文件读写操作,提高了并发处理能力。 #### 六、...
#### 二、JAVA的多态 **定义与作用:** 1. **定义:** 多态是指不同类的对象对同一消息作出响应,使得同一消息可以在不同类型的对象上表现出不同的行为。 2. **作用:** 消除类型之间的耦合关系,提高代码的可扩展...
【Java面试知识点详解】 在Java面试中,面试官通常会关注候选人的基础知识、编程能力、设计模式理解、并发处理、内存管理以及框架应用等多个方面。以下是对这些关键知识点的详细阐述: 1. **基础语法与面向对象:*...
除了堆和栈之外,Java程序还可能使用本机内存(Native Memory),这通常是指Java虚拟机之外的内存,例如直接缓冲区(Direct Buffer)所使用的内存。直接缓冲区是在Java NIO(New I/O)包中引入的,用于提高I/O操作的...
- NIO(New IO)的理解,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。 - 文件操作,包括复制、重命名、删除等。 6. **网络编程**: - Socket编程的基本原理和应用。 - HTTP协议的理解,包括...
- **缓冲区(Buffer):** 缓冲区是Java NIO中最重要的组成部分之一。学习如何使用ByteBuffer、CharBuffer等不同类型的缓冲区。 - **通道(Channel):** 通道提供了与源节点和目标节点之间的连接。学习如何使用...
### Java技术分享知识点详解 #### 一、技术讨论 ##### 1.1 OFFHEAP -- 老宋分享 OFFHEAP(非堆内存)是一种不在JVM管理下的内存区域,通常用于存储大量数据,避免频繁的垃圾回收操作,从而提高性能。在Java中,...
- **NIO**:了解非阻塞I/O,Channel、Buffer、Selector的使用。 - **文件操作**:File类的常用方法,文件的复制、删除、重命名等操作。 6. **网络编程**: - **Socket通信**:TCP和UDP的区别,如何建立连接,...
### Java基础知识点详解 #### Arrays.sort实现原理与Collection实现原理 - **Arrays.sort**:`Arrays.sort()` 方法内部实现依赖于具体的JDK版本。在Java 7及之前版本,对于基本类型,它采用的是快速排序算法;对于...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...