DBMNG数据库管理与应用

独立思考能力,对于从事科学研究或其他任何工作,都是十分必要的。
当前位置:首页 > MySQL > 常见问题

为基于通道的I/O使用NIO(1)

20.4.1 为基于通道的I/O使用NIO(1)

NIO的重要应用是通过通道和缓存访问文件。下面演示了使用通道读取文件以及写入文件的一些技术。

1. 通过通道读取文件

使用通道从文件读取数据有多种方式。最常用的方式可能是手动分配缓存,然后执行显式的读取操作,读取操作使用来自文件的数据加载缓存。下面首先介绍这种方式。

在能够从文件读取数据之前必须打开文件。为此,首先创建描述文件的Path对象,然后使用Path对象打开文件。根据使用文件的方式,有各种打开文件的方式。在这个例子中,将为基于字节的输入打开文件,通过显式的输入操作进行字节输入。所以,这个例子将通过调用Files.newByteChannel()来打开文件并建立链接到文件的通道。newByteChannel()方法的一般形式如下:

  1. static SeekableByteChannel newByteChannel(Path path, OpenOption ... how)   
  2. throws IOException 

该方法返回的SeekableByteChannel对象封装了文件操作的通道。描述文件的Path对象是通过path传递的。参数how指定了打开文件的方式,因为是可变长度参数,所以可以指定0个或多个由逗号隔开的参数(在前面讨论过有效值,并在表20-7中显示了这些值)。如果没有指定参数,将为输入操作打开文件。SeekableByteChannel是接口,用于描述能够用于文件操作的通道。FileChannel类实现了该接口。如果使用的是默认文件系统,那么可以将返回对象强制转换成FileChannel类型。通道使用完之后必须关闭。既然所有通道—— 包括FileChannel,都实现了AutoCloseable接口,那么可以使用带资源的try语句自动关闭文件,而不必显式地调用close()方法,在示例中将使用这种方式。

接下来,必须通过封装已经存在的数组或通过动态分配缓存来获取缓存,缓存将由通道使用。示例程序将动态分配缓存,但是可以自行选择任何一种方式。因为文件通道操作字节数组,所以将使用ByteBuffer定义的allocate()方法获取缓存。该方法的一般形式如下所示: 

			
  1. static ByteBuffer allocate(int cap)  

其中,cap指定了缓存的容量。该方法返回对缓存的引用。

创建缓存后,在通道上调用read()方法,传递指向缓存的引用。在此使用的read()版本如下所示: 

			
  1. int read(ByteBuffer buf) throws IOException 

每次调用read()方法时,都使用来自文件的数据填充buf指定的缓存。读取是连续的,这意味着每次调用read()方法都会从文件读取后续字节以填充缓存。read()方法返回实际读取的字节数量。当试图在文件末尾读取时,该方法会返回.1。

下面的程序将应用前面讨论的技术,使用显式的输入操作通过通道读取文件test.txt:


 
 
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号