跟我学NIO(Channel对象和Buffer对象)

通道是对原I/O包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个Channel对象。一个Buffer实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。

        通道(Channel)和缓冲区(Buffer)是NI/O中的核心对象,几乎在每一个I/O操作中都要使用它们。

        通道是对原I/O包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个Channel对象。一个Buffer实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。

什么是缓冲区?

        Buffer是一个对象,它包含一些要写入或者读出的数据。在NI/O中加入Buffer对象,体现了新库与原I/O的一个重要区别。在面向流的I/O中,您将数据直接写入或者将数据直接读到Stream对象中。

        在NI/O库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NI/O中的数据,您都是将它放到缓冲区中。

        缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。

缓冲区类型:

        最常用的缓冲区类型是ByteBuffer。一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。但是,ByteBuffer不是NI/O中唯一的缓冲区类型。事实上,对于每一种基本Java类型都有一种缓冲区类型:

        1、ByteBuffer

        2、CharBuffer

        3、ShortBuffer

        4、IntBuffer

        5、LongBuffer

        6、FloatBuffer

        7、DoubleBuffer

        每一个Buffer类都是Buffer接口的一个实例。除了ByteBuffer,每一个Buffer类都有完全一样的操作,只是它们所处理的数据类型不一样。因为大多数标准I/O操作都使用ByteBuffer,所以它具有所有共享的缓冲区操作以及一些特有的操作。实例:怎样使用FloatBuffer。

import java.nio.*;

public class UseFloatBuffer
{
  static public void main( String args[] ) throws Exception {
    FloatBuffer buffer = FloatBuffer.allocate(10);

    for (int i=0; i<buffer.capacity(); ++i) {
      float f = (float)Math.sin( (((float)i)/10)*(2*Math.PI) );
      buffer.put( f );
    }

    buffer.flip();

    while (buffer.hasRemaining()) {
      float f = buffer.get();
      System.out.println( f );
    }
  }
}

什么是通道?

        Channel是一个对象,可以通过它读取和写入数据。拿NI/O与原来的I/O做个比较,通道就像是流。

        正如前面提到的,所有数据都通过Buffer对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

通道类型

        通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类),而通道可以用于读、写或者同时用于读写。因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在UNIX模型中,底层操作系统通道是双向的。

少壮不努力,老大徒悲伤。——汉乐府古辞《长歌行》
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号