我有一个包含大文件(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循环结构.