过去,我讨论过RandomAccessFile
以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。
Channel提供了一种从文件读取数据的替代方法,它提供了比InputStream或OutputStream更好的性能。 也可以在阻止和非阻止模式下打开它。 虽然, FileChannles是读/写通道,并且它们始终处于阻塞状态 ,但不能将其置于非阻塞模式。 RandomAccessFile类将文件视为字节数组。
您可以在数组的任何位置写入数据,也可以从任何位置读取数据。 为此,它使用保存当前位置的指针,并提供诸如seek()
几种方法来移动该指针。 一旦定位正确,就可以从RandomAccessFile
获取FileChannel
并开始从文件中读取数据。 顺便说一下,JDK 7还引入了NIO 2,它使处理文件和目录变得更加容易。 阅读Anghel Leonard 撰写的Pro Java 7 NIO.2以了解更多信息。
如何使用FileChannel和ByteBuffer读取/写入文件
在开始编码之前,让我们修改Java NIO中Channel和Buffer的基本概念。 一言以蔽之,缓冲区与通道一起工作。 通道是传输数据的管道,缓冲区是数据传输的源和目标。 对于写操作,要写入的数据放置在缓冲区中,该缓冲区将传递到通道,而不是通道从缓冲区读取该数据并将其写入文件。
同样,在读取的情况下,通道会将数据放入您从文件 , 网络或任何其他来源提供的缓冲区中。 由于相同的缓冲区用于读取和写入,即您将数据写入缓冲区,而通道将其读取以写入文件,因此,一旦完成写入缓冲区,就必须调用flip()方法。 flip()方法更改指针,并允许您从缓冲区读取数据。 Java中的缓冲区有三种类型, 直接缓冲区