博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO入门系列之第二章:通道和缓冲区
阅读量:7089 次
发布时间:2019-06-28

本文共 1724 字,大约阅读时间需要 5 分钟。

第2章 通道和缓冲区

2.1  概述

通道缓冲区 NIO 中的核心对象,几乎在每一个I/O 操作中都要使用它们。

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

2.2  什么是缓冲区?

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

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

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

2.3  缓冲区类型

最常用的缓冲区类型是 ByteBuffer。一个 ByteBuffer 可以在其底层字节数组上进行 get/set 操作(即字节的获取和设置)

ByteBuffer 不是 NIO 中唯一的缓冲区类型。事实上,对于每一种基本 Java 类型都有一种缓冲区类型:

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

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

现在您可以花一点时间运行 UseFloatBuffer.java,它包含了类型化的缓冲区的一个应用例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 );
    
}
  
}
}

2.4  什么是通道?

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

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

2.5  通道类型

通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是InputStream 或者 OutputStream的子类)通道可以用于读、写或者同时用于读写。

因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在 UNIX 模型中,底层操作系统通道是双向的。

本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/1409428

转载地址:http://ofbql.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
Facebook ATC 弱网测试项目部署
查看>>
关于p-vol和s-vol
查看>>
一八年第三天晚上十点半的thinking
查看>>
ksh和bash区别
查看>>
keepalived 组播的配置
查看>>
华为路由器交换机配置相关功能
查看>>
谷歌收购眼球追踪技术公司Eyefluence,眼动关注度将成为VR的新视角
查看>>
【蜕变之路】第32天 使用STS创建SpringBoot项目 (2019年3月22日)
查看>>
Oracle之数据挖掘的更新介绍
查看>>
NFS
查看>>
Exception异常处理
查看>>
第二十讲 任务的挂起和恢复
查看>>
emmm算是来了
查看>>
do…while语句
查看>>
网络工程师成长日记413-长安大学交换机项目
查看>>
jenkins
查看>>
设置中奖概率
查看>>
第4章 类名作为形参和返回值
查看>>
Java 正则表达式
查看>>