如果我们超过了java中ByteBuffer.allocate(48) NIO包类中分配缓冲区的容量怎么办
Posted
技术标签:
【中文标题】如果我们超过了java中ByteBuffer.allocate(48) NIO包类中分配缓冲区的容量怎么办【英文标题】:what if we exceed the capacity of allocating buffer in ByteBuffer.allocate(48) NIO package class in java 【发布时间】:2012-04-29 14:55:17 【问题描述】: file = new RandomAccessFile("xanadu.txt", "rw");
FileChannel channel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(48);
int byteReads = channel.read(buffer);
所以我在缓冲区中分配了 48 个容量。现在 考虑我正在阅读的 txt 文件大约 10MB ,所以从逻辑上讲它跨越了缓冲区分配大小。 但是当我们尝试读取时,我们将能够读取文件的所有内容,而不管文件大小。 所以这件事怎么可能。
我是这个流媒体领域的新手,所以我的问题可能看起来很基本。
【问题讨论】:
【参考方案1】:read
调用根本不会读取超过 48 个字节。
什么都不会溢出,您只需要反复调用read
,直到您读取所有您期望的数据。
这在ReadableByteChannel
接口文档中有说明:
从这个通道读取一个字节序列到给定的缓冲区中。
尝试从通道读取最多 r 个字节,其中 r 是在调用此方法时缓冲区中剩余的字节数,即 dst.remaining()。
您需要在处理完缓冲区内容后clear()
,然后再将其传递回read
。
【讨论】:
你应该做read()
、flip()
、get()
(或暗示它的东西),然后是compact()
。 clear()
假设您已经处理了所有数据。 compact()
没有。以上是关于如果我们超过了java中ByteBuffer.allocate(48) NIO包类中分配缓冲区的容量怎么办的主要内容,如果未能解决你的问题,请参考以下文章
测者的测试技术手册:揭开java method的一个秘密--巨型函数