20.5.2 写文件(JDK 7之前)
下面重写前面显示的两个基于通道的文件输出示例,从而只使用JDK 7之前的特性。第一个例子通过手动分配缓存,然后执行显式的输出操作来写入文件。第二个例子使用映射文件自动执行这个过程。对于这两个例子,都既不使用Path对象也不使用带资源的try语句。这是因为它们都是由JDK 7新增的部分。
如果使用JDK 7之前的Java版本,当使用通道和手动分配的缓存写文件时,首先需要针对输出打开文件。这是通过创建FileOutputStream对象完成的,正如在第19章所描述的。接下来调用getChannel()方法,获取链接到文件的通道,然后调用allocate()方法以分配字节缓存,就像刚才描述的那样。接下来将希望写入的输入放到缓存中,然后对通道调用write()方法。下面的程序演示了这个过程。该程序将字母表写入到test.txt文件中。
|
在将数据写入到mBuf中之后,为了将当前位置重置为0,需要对mBuf调用rewind()方法。请记住,每次put()调用都会向前推进当前位置。所以在调用write()方法之前,需要将当前位置重置到缓存的开头。如果没有这么做,write()方法就会认为缓存中没有数据。
如果使用JDK 7之前的Java版本,通过映射文件来写入文件,就需要遵循以下步骤。首先,通过创建RandomAccessFile对象为读/写操作打开文件。为了能够从文件读取数据并且能够向文件中写入数据,这是必须要做的。接下来对RandomAccessFile对象调用map()方法,将文件映射到缓存。然后写入缓存。因为缓存被映射到文件,所以对缓存的任何修改都会反映到文件中,因此不需要对通道执行显式的写操作。
下面的程序对前面的程序进行了重写,从而使用映射文件: