这些 Java 教程是针对 JDK 8 编写的。本页面描述的示例和实践不利用后续版本引入的改进,并可能使用已不再可用的技术。
有关 Java SE 9 及其后续版本中更新的语言功能的摘要,请参阅Java 语言变更。
有关所有 JDK 发行版的新功能、增强功能和已移除或已废弃选项的信息,请参阅JDK 发行说明。
随机访问文件允许对文件内容进行非连续或随机访问。要随机访问文件,您需要打开文件,寻找特定位置,并从该位置读取或写入文件。
这种功能可以通过SeekableByteChannel
接口实现。 SeekableByteChannel
接口通过当前位置的概念扩展了通道I/O。方法使您能够设置或查询位置,并从该位置读取数据或将数据写入该位置。该API由几个易于使用的方法组成:
position
- 返回通道的当前位置position(long)
- 设置通道的位置read(ByteBuffer)
- 从通道中读取字节到缓冲区write(ByteBuffer)
- 将字节从缓冲区写入通道truncate(long)
- 截断与通道连接的文件(或其他实体)使用通道I/O读写文件表明Path.newByteChannel
方法返回一个SeekableByteChannel
实例。在默认文件系统上,您可以直接使用该通道,或将其转换为FileChannel
,以便访问更高级的功能,例如将文件的某个区域直接映射到内存中以实现更快的访问、锁定文件的某个区域,或在不影响通道当前位置的情况下从绝对位置读取和写入字节。
以下代码片段使用newByteChannel
方法打开一个文件以供读取和写入。返回的SeekableByteChannel
被转换为FileChannel
。然后,从文件开头读取12个字节,并在该位置写入字符串"I was here!"。文件中的当前位置移到末尾,并将开头的12个字节追加。最后,追加字符串"I was here!",并关闭文件上的通道。
String s = "我在这里!\n"; byte data[] = s.getBytes(); ByteBuffer out = ByteBuffer.wrap(data); ByteBuffer copy = ByteBuffer.allocate(12); try (FileChannel fc = (FileChannel.open(file, READ, WRITE))) { // 读取文件的前12个字节。 int nread; do { nread = fc.read(copy); } while (nread != -1 && copy.hasRemaining()); // 将"I was here!"写入文件开头。 fc.position(0); while (out.hasRemaining()) fc.write(out); out.rewind(); // 移动到文件末尾。将前12个字节复制到文件末尾。然后再次写入"I was here!"。 long length = fc.size(); fc.position(length-1); copy.flip(); while (copy.hasRemaining()) fc.write(copy); while (out.hasRemaining()) fc.write(out); } catch (IOException x) { System.out.println("I/O异常:" + x); }