Java 如何从ByteBuffer中获得连续切片?

Java 如何从ByteBuffer中获得连续切片?,java,bytebuffer,Java,Bytebuffer,我有一个包含大文件(100 MB)的文件: 我一次只能合法地向writeChannel写入1MB 如何将ByteBuffer的内容分片,一次只将1MB的片写入writeChannel?据我所知,writeChannel上的write()将“尝试将最多r个字节写入通道,其中r是调用此方法时缓冲区中剩余的字节数,即dst.remaining()。”(根据) 的描述中说,此方法将“返回当前位置和限制之间的元素数” 因此,我的猜测不是您不能编写整个ByteBuffer,而是您的代码应该调用ByteBuf

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

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

如何将ByteBuffer的内容分片,一次只将1MB的片写入
writeChannel

据我所知,writeChannel上的write()将“尝试将最多r个字节写入通道,其中r是调用此方法时缓冲区中剩余的字节数,即dst.remaining()。”(根据)

的描述中说,此方法将“返回当前位置和限制之间的元素数”

因此,我的猜测不是您不能编写整个ByteBuffer,而是您的代码应该调用ByteBuffer对象上的flip(),使其成为:

java.nio.ByteBuffer byteBuffer = ByteBuffer.wrap(multipartFile.getBytes());
byteBuffer.flip();
writeChannel.write(byteBuffer);
writeChannel.closeFinally();
如中所述:“在一系列通道读取或put操作之后,调用此方法为一系列通道写入或相对get操作做好准备“

您可以使用获取基本
ByteBuffer
实例的重复视图,然后沿着该位置移动,以显示内容的滑动窗口。或者,如果不需要向任何其他使用者公开基本缓冲区,也可以对其执行相同的操作

您可以通过更改内容视图的起始位置,也可以通过更改视图的结束位置。只要注意不要将视图推到基础缓冲区的限制之外,就可以执行以下操作:

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)));
我没有测试它,但它看起来是正确的。可以重写以避免位置的初始设置,这在这里并不是绝对必要的,但它会导致一些重复或第一次到第二次的更尴尬的特殊情况处理


我这样做是为了保留for循环的基本结构。

为什么?只需编写缓冲区,让系统决定如何对其进行打包,或者您尝试执行的任何操作。
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)));