java IO -- IntBuffer

java IO -- IntBuffer_第1张图片

java新IO之Buffer

1、什么是java新IO

在jdk1.4之后呢,为了提高IO操作的性能,提供了一个新的开发包,NIO,此

包定义在java.nio.*中。
在java中,已有的IO操作大部分都属于阻塞的操作,例如,键盘输入数据,

必须一直等待用户输入数据,否则程序不能继续执行。另外,还有socket程

序中服务器必须通过accept()方法等待用户连接,这就造成了大量的系统

资源的浪费。所以呢在jdk1.4之后引入了新IO,在整个新IO的操作基本上都

是使用缓冲区来完成的。


2、Buffer-->缓冲区


在基本io操作中,所有的操作都是以流的形式完成的,但是在新IO中所有的

操作都是要使用到Buffer,所有的读写操作都是通过缓冲区完成的。

 

2、1  Buffer:

  是一个线性的,有序的数据集,只能容纳某种特定类型数据。


在jdk api 1.6中是这样定义的:

public abstract class Bufferextends Object一个用于特定基本类型数据

的容器。

缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性

还包括容量、限制和位置:

缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更

改。

缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能

为负,并且不能大于其容量。

缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负

,并且不能大于其限制。

对于每个非 boolean 基本类型,此类都有一个子类与之对应。

 

2、2 Buffer的清除、反转和重绕


除了访问位置、限制、容量值的方法以及做标记和重置的方法外,此类还定

义了以下可对缓冲区进行的操作:

clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限

制设置为容量大小,将位置设置为 0。

flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限

制设置为当前位置,然后将位置设置为 0。

rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,

将位置设置为 0


2、3 线程安全


多个当前线程使用缓冲区是不安全的。如果一个缓冲区由不止一个线程使用

,则应该通过适当的同步来控制对该缓冲区的访问。


2、4 调用链


指定此类中的方法返回调用它们的缓冲区(否则它们不会返回任何值)。此

操作允许将方法调用组成一个链;例如,语句序列

 b.flip();
 b.position(23);
 b.limit(42);可以由以下更紧凑的一个语句代替
 b.flip().position(23).limit(42);


3、Buffer中的方法

 

3、1  position方法

@  :public final int position()返回此缓冲区的位置。

@  :public final Buffer position(int newPosition)

设置此缓冲区的位置。如果标记已定义且大于新的位置,则丢弃该标记。


3、2     limit方法

@  :public final int limit()返回此缓冲区的限制。

@  :public final Buffer limit(int newLimit)

设置此缓冲区的限制。如果位置大于新的限制,则将它设置为新限制。如果

标记已定义且大于新限制,则丢弃该标记。

 

3、3 capacity 容量

public final int capacity()   返回此缓冲区的容量。


java新IO之IntBuffer


1 : put方法,position方法,limit方法,capacity方法


public abstract IntBuffer put(int i)


相对 put 方法(可选操作)。
将给定 int 写入此缓冲区的当前位置,然后该位置递增。
参数:i - 要写入的 int
返回:此缓冲区
抛出: BufferOverflowException - 如果此缓冲区的当前位置不小于界限
 
       ReadOnlyBufferException - 如果此缓冲区是只读的

 

 

下面是一个例子:

 

java IO -- IntBuffer_第2张图片


 运行结果截图:

 

java IO -- IntBuffer_第3张图片

 2、 flip方法

public final Buffer flip()

反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为 0。

 

[java] view plain copy print ?
  1. package org.liuchao;  
  2. import java.nio.*;  
  3. public class IntBufferDemo {  
  4.   
  5. public static void main(String[] args) {  
  6.   // TODO Auto-generated method stub  
  7.   IntBuffer buf = IntBuffer.allocate(20);//设置缓冲区容量为20个大小  
  8.   System.out.println("缓冲区写入数据之前:");  
  9.   System.out.println(buf.capacity());//调用capacity方法返回buf容量  
  10.   System.out.println(buf.position());//调用position方法返回buf的位置  
  11.   System.out.println(buf.limit());//调用limit方法返回buf的限制  
  12.   int temp[]={1,2,3,4};  
  13.   int i = 0;  
  14.   buf.put(i);//写入i  
  15.   buf.put(temp);//写入数组temp  
  16.   System.out.println("缓冲区写入数据之后:");  
  17.   System.out.println(buf.capacity());//调用capacity方法返回buf容量  
  18.   System.out.println(buf.position());//调用position方法返回buf的位置  
  19.   System.out.println(buf.limit());//调用limit方法返回buf的限制  
  20.   System.out.println("缓冲区内容:");  
  21.   buf.flip();//反转此缓冲区  
  22.   //输出缓冲区内容  
  23.   while(buf.hasRemaining()){  
  24.    int x = buf.get();//相对 get 方法。读取此缓冲区当前位置的 int,然后该位置递增。  
  25.    System.out.println(x);  
  26.   }  
  27.   }  
  28. }  


运行截图:

java IO -- IntBuffer_第4张图片

你可能感兴趣的:(java,索引,IO,线程安全,IntBuffer)