如果我们超过了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的一个秘密--巨型函数

解决java poi导出excel2003不能超过65536行的问题

java异常笔记

如何通过Java中的LDAP获取AD组的所有成员

如何缩小外部java库?

是否可以强制现有 Java 应用程序使用不超过 x 个内核?