如何从ByteBuffer中获取连续切片?

Per*_*rcy 5 java bytebuffer

我有一个包含大文件(100 MB)的ByteBuffer:

    java.nio.ByteBuffer byteBuffer = ByteBuffer.wrap(multipartFile.getBytes());
    writeChannel.write(byteBuffer);
    writeChannel.closeFinally();
Run Code Online (Sandbox Code Playgroud)

我一次只能合法地写1 MB writeChannel.

如何切片ByteBuffer的内容,一次只写1 MB的切片到writeChannel

seh*_*seh 10

您可以使用ByteBuffer#slice()获取基本ByteBuffer实例的重复视图,然后沿着位置突出显示内容的滑动窗口.或者,如果您不需要将其暴露给任何其他使用者,则可以对基本缓冲区执行相同操作.

您可以通过单参数Buffer#position(int)方法更改内容视图的起始位置,并通过更改视图的结束位置Buffer#limit(int).只要您注意不要将视图超出底层缓冲区的限制,您就可以执行以下操作:

final ByteBuffer view = base.slice();
for (int start = base.position(), end = base.limit(), stride = 1000000;
     start != end;
     start = view.limit())
  consume(view.position(start)
              .limit(start + Math.min(end - start, stride)));
Run Code Online (Sandbox Code Playgroud)

我没有测试它,但它看起来是正确的.可以重写以避免初始设置位置,这在这里并不是绝对必要的,但是它会导致第一次重复或更尴尬的特殊情况处理.

我这样离开它来保留基本的for循环结构.