20.4.1 为基于通道的I/O使用NIO(4)
注意在每次读和写操作之间都要调用rewind()方法。
关于该程序需要注意的另外一点是:当将缓存写入文件时,文件中的前26个字节将包含输出。如果文件test.txt先前就已经存在,那么在执行程序后,test.txt中的前26个字节将包含字母表,但是文件的剩余部分会保持不变。
写入文件的另外一种方式是将文件映射到缓存。这种方式的优点是:写入到缓存中的数据会被自动写入到文件中,不需要显式的写操作。为了映射和写入文件内容,需要使用以下一般过程。首先,获取封装文件的Path对象,然后调用Files.newByteChannel()方法,传递获取的Path对象作为参数,创建链接到文件的通道。将newByteChannel()方法返回的引用转换成FileChannel类型。接下来对通道调用map()方法将通道映射到缓存。在前面已经详细描述了map()方法。为了方便起见,在此对其进行总结。下面是map()方法的一般形式:
- MappedByteBuffer map(FileChannel.MapMode how,
- long pos, long size) throws IOException
map()方法导致文件中的数据被映射到内存中的缓存。how的值决定了允许的操作类型。为了写入文件,how必须是MapMode.READ_WRITE。文件中开始映射的位置是由pos指定的,映射的字节数量是由size决定的。map()方法返回指向缓存的引用。一旦将文件映射到缓存,就可以向缓存写入数据,并且这些数据会被自动写入到文件中。所以,不需要对通道执行显式的写入操作。
下面的程序对前面的程序进行了改写,从而使用映射文件。注意在newByteChannel()方法调用中,添加了StandardOpenOption.READ打开选项。这是因为映射文件要么是只读的,要么是读/写的。因此,为了向映射文件中写入数据,必须以读/写模式打开通道。