`
SwordShadow
  • 浏览: 271385 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java NIO 详解(二)缓存区与Buffer

    博客分类:
  • java
阅读更多

       在基本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、

 

   

 

1
2
分享到:
评论

相关推荐

    Java nio详细介绍 详细介绍java nio

    #### 二、Buffer & Channel(缓冲区与通道) **Buffer** 和 **Channel** 是NIO中的两个核心概念。 1. **Buffer是什么?** - **定义**:`Buffer`是一个包含数据的对象,用于读写操作。在NIO中,所有数据的读写都...

    JAVANIO简介.pdf

    ### JAVANIO简介 #### 一、基本概念与传统IO 在计算机科学领域中,**IO(Input/Output)**是指主存与外部设备(如硬盘、终端、网络等)之间传输数据的过程。它是操作系统的一项核心功能,通过专用的I/O指令来实现。...

    java读取大文件大全

    ### Java读取大文件技术详解 #### 一、引言 在Java开发中,处理大文件是一项常见的任务,尤其在数据分析、日志处理等领域尤为重要。本文将深入探讨如何使用Java来高效地读取大文件,并提供一个具体的示例代码进行...

    Java Socket编程.pdf

    控制默认行为涵盖了一系列的选项,例如Keep-Alive、发送和接收缓存区大小等。关闭连接的方法和Applets(小程序)也是进阶内容的一部分。 8. NIO(New Input/Output) NIO是一种可以替代传统I/O的新的I/O编程模式,...

    Java TCP/IP Socket编程

    - **控制默认行为**:可以根据具体需求调整套接字的行为,如启用Keep-Alive选项、调整发送和接收缓存区的大小等。 #### 9. NIO(New IO) - **为什么需要NIO**:传统的IO模型在处理大量连接时效率较低,NIO提供了...

    Java_TCPIP_Socket编程.pdf

    - **发送和接收缓存区的大小**:调整缓存区大小以优化性能。 - **超时**:设置超时时间。 - **地址重用**:允许套接字使用已被占用的地址。 - **消除缓冲延迟**:减少数据发送的延迟。 - **紧急数据**:发送...

    Java+TCPIP+Socket编程(中文版)

    ### Java+TCPIP+Socket编程(中文版) —— 关键知识点详解 #### 第1章 简介 - **计算机网络、分组报文和协议** 计算机网络是通过通信设备和线路将地理位置分散、功能独立的多个计算机系统互连起来,以功能完善的...

    最近5年133个Java面试问题列表

    NIO(New IO)是从Java 1.4版本开始提供的新的IO API,它提供了基于通道(channel)和缓冲区(buffer)的模型,支持面向块的IO操作,从而提高了性能。NIO还引入了选择器(selector),可以有效地支持多路复用的非阻塞IO操作...

    Java输入输出(IO)操作.md

    - **NIO (New IO)**:引入了通道(Channel)和缓冲区(Buffer)的概念,支持非阻塞模式,可以显著提升文件读写的效率。 - **异步IO**:支持在不阻塞当前线程的情况下进行文件读写操作,提高了并发处理能力。 #### 六、...

    Java基础知识点汇总

    #### 二、JAVA的多态 **定义与作用:** 1. **定义:** 多态是指不同类的对象对同一消息作出响应,使得同一消息可以在不同类型的对象上表现出不同的行为。 2. **作用:** 消除类型之间的耦合关系,提高代码的可扩展...

    搜集的java相关的面试题

    【Java面试知识点详解】 在Java面试中,面试官通常会关注候选人的基础知识、编程能力、设计模式理解、并发处理、内存管理以及框架应用等多个方面。以下是对这些关键知识点的详细阐述: 1. **基础语法与面向对象:*...

    JAVA-内存模型.docx

    除了堆和栈之外,Java程序还可能使用本机内存(Native Memory),这通常是指Java虚拟机之外的内存,例如直接缓冲区(Direct Buffer)所使用的内存。直接缓冲区是在Java NIO(New I/O)包中引入的,用于提高I/O操作的...

    JAVA企业面试题

    - NIO(New IO)的理解,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。 - 文件操作,包括复制、重命名、删除等。 6. **网络编程**: - Socket编程的基本原理和应用。 - HTTP协议的理解,包括...

    java学习路线.docx

    - **缓冲区(Buffer):** 缓冲区是Java NIO中最重要的组成部分之一。学习如何使用ByteBuffer、CharBuffer等不同类型的缓冲区。 - **通道(Channel):** 通道提供了与源节点和目标节点之间的连接。学习如何使用...

    java技术分享

    ### Java技术分享知识点详解 #### 一、技术讨论 ##### 1.1 OFFHEAP -- 老宋分享 OFFHEAP(非堆内存)是一种不在JVM管理下的内存区域,通常用于存储大量数据,避免频繁的垃圾回收操作,从而提高性能。在Java中,...

    Java经典面试题全集-绝对经典

    - **NIO**:了解非阻塞I/O,Channel、Buffer、Selector的使用。 - **文件操作**:File类的常用方法,文件的复制、删除、重命名等操作。 6. **网络编程**: - **Socket通信**:TCP和UDP的区别,如何建立连接,...

    java超有用的面试题目

    ### Java基础知识点详解 #### Arrays.sort实现原理与Collection实现原理 - **Arrays.sort**:`Arrays.sort()` 方法内部实现依赖于具体的JDK版本。在Java 7及之前版本,对于基本类型,它采用的是快速排序算法;对于...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA网络编程从入门到精通

    ### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...

Global site tag (gtag.js) - Google Analytics