DBMNG数据库管理与应用

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

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

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

注意在每次读和写操作之间都要调用rewind()方法。

关于该程序需要注意的另外一点是:当将缓存写入文件时,文件中的前26个字节将包含输出。如果文件test.txt先前就已经存在,那么在执行程序后,test.txt中的前26个字节将包含字母表,但是文件的剩余部分会保持不变。

写入文件的另外一种方式是将文件映射到缓存。这种方式的优点是:写入到缓存中的数据会被自动写入到文件中,不需要显式的写操作。为了映射和写入文件内容,需要使用以下一般过程。首先,获取封装文件的Path对象,然后调用Files.newByteChannel()方法,传递获取的Path对象作为参数,创建链接到文件的通道。将newByteChannel()方法返回的引用转换成FileChannel类型。接下来对通道调用map()方法将通道映射到缓存。在前面已经详细描述了map()方法。为了方便起见,在此对其进行总结。下面是map()方法的一般形式:

  1. MappedByteBuffer map(FileChannel.MapMode how,   
  2. long pos, long size) throws IOException 

map()方法导致文件中的数据被映射到内存中的缓存。how的值决定了允许的操作类型。为了写入文件,how必须是MapMode.READ_WRITE。文件中开始映射的位置是由pos指定的,映射的字节数量是由size决定的。map()方法返回指向缓存的引用。一旦将文件映射到缓存,就可以向缓存写入数据,并且这些数据会被自动写入到文件中。所以,不需要对通道执行显式的写入操作。

下面的程序对前面的程序进行了改写,从而使用映射文件。注意在newByteChannel()方法调用中,添加了StandardOpenOption.READ打开选项。这是因为映射文件要么是只读的,要么是读/写的。因此,为了向映射文件中写入数据,必须以读/写模式打开通道。

 
可以看出,对于通道自身没有显式的写操作。因为mBuf被映射到文件,所以对mBuf的修改会自动反映到底层的文件中。
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号