MST

星途 面试题库

面试题:Java中NIO Buffer的关键属性及作用

请详细阐述Java NIO中Buffer的四个关键属性(capacity、position、limit、mark),并说明它们在Buffer读写操作过程中是如何变化的。
24.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 四个关键属性阐述

  • capacity(容量)
    • 表示 Buffer 可以容纳的数据元素的最大数量。一旦 Buffer 被创建,它的 capacity 就固定不变。例如,对于 ByteBuffer,如果分配了 1024 字节的空间,capacity 就是 1024。这个值主要用于确定 Buffer 整体的存储能力。
  • position(位置)
    • 指示当前读写操作的位置。在初始状态或读完数据后重置时,position 为 0。每次读写一个数据元素(例如一个字节、一个整数等,取决于 Buffer 的类型),position 就会相应地增加。例如,从 ByteBuffer 中读取一个字节后,position 就从 0 变为 1,表示下一次读写操作将从位置 1 开始。它标记了下一个要读取或写入的数据的位置。
  • limit(限制)
    • 表示 Buffer 中可以读写的数据的截止位置。在写模式下,limit 等于 capacity,意味着可以写入整个 Buffer 的容量大小的数据。当切换到读模式时(例如通过调用 flip() 方法),limit 被设置为当前 position 的值,这表明只能读取已经写入的数据,而不会读取到 Buffer 中未初始化的部分。
  • mark(标记)
    • 是一个备忘位置。调用 mark() 方法时,它会将当前的 position 值记录下来作为标记。之后可以通过调用 reset() 方法将 position 恢复到 mark 记录的位置。这在需要重复读取一段数据或者在特定位置暂停读写操作并稍后恢复时很有用。例如,在读取过程中,当到达某个特定位置时调用 mark(),如果后续操作需要重新回到这个位置,就可以调用 reset()。默认情况下,mark 的值是 -1,表示没有设置标记。

2. 读写操作过程中属性的变化

  • 写操作
    • 初始状态下,position = 0,limit = capacity。
    • 每次写入一个数据元素,position 增加相应的数据元素大小(例如写入一个字节,position 增加 1)。
    • 当写入的数据量达到 capacity 时,Buffer 被写满,position = capacity。此时如果继续写入,会抛出 BufferOverflowException
  • 从写模式切换到读模式
    • 调用 flip() 方法,这个方法会将 limit 设置为当前 position 的值,然后将 position 重置为 0。例如,假设写操作后 position 为 50(已经写入了 50 个数据元素),调用 flip() 后,limit = 50,position = 0,这样就准备好从开始位置读取已经写入的 50 个数据元素。
  • 读操作
    • 读模式下,初始 position = 0,limit 为写模式结束时的 position 值(通过 flip() 设置)。
    • 每次读取一个数据元素,position 增加相应的数据元素大小。
    • 当 position 达到 limit 时,表示已经读取完所有写入的数据,继续读取会抛出 BufferUnderflowException
  • 重置与重复读取
    • 如果在读取过程中调用 mark(),mark 记录当前 position 的值。
    • 调用 reset() 时,position 恢复到 mark 记录的值,从而可以重复读取之前标记位置开始的数据。
    • 如果调用 clear() 方法,position 被设置为 0,limit 被设置为 capacity,mark 被丢弃(设置为 -1),Buffer 进入可以重新写入数据的状态,但数据内容不会被清除,只是状态被重置。