问题标签 [bytebuffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
364 浏览

java - 使用 JavaNIO 发送/接收对象/引用或对象的一部分

我用 NIO 设计了一个实时物理模拟,它是关于在多个客户端上同时(实时)移动球

目前,我通过字符串解析发送一个球的坐标,但现在我想移动多个球并希望有一些除发送字符串之外的通用机制,所以我在服务器上创建了 4 个球。

它是如何实现的,每个球的坐标对应于客户端上的同一个球(我也在客户端上创建),并且每个球都可以根据从服务器接收到的坐标移动。

这应该通过发送每个球的引用来实现,但我不知道如何使用 java 字节缓冲区和整体 NIO 来实现。

我的实现有问题,如果有人帮助我提供代码示例,那就太好了,无论如何,这对于发送模拟数据(如字符串以外的对象坐标)是通用的(如果有人做了类似的工作),但它应该实现我描述的用例。

谢谢,

吉比拉拉

PS:我可以知道Downvoting问题的原因吗?

0 投票
4 回答
78151 浏览

java - ByteBuffer.allocate() 与 ByteBuffer.allocateDirect()

To allocate()or to allocateDirect(),这是个问题。

几年来,我一直坚持认为,由于DirectByteBuffers 是操作系统级别的直接内存映射,因此使用 get/put 调用它会比HeapByteBuffers 执行得更快。直到现在,我才真正有兴趣了解有关情况的确切细节。我想知道这两种ByteBuffers 中哪一种更快,在什么条件下。

0 投票
2 回答
3713 浏览

java - 如何限制使用 Java NIO 从 SocketChannel InputStream 一次读取一行

我正在尝试编写 Websockets 客户端和服务器。最初连接是 HTTP,Websockets 握手使用 HTTP 标头来指示连接上需要升级到新协议。

我想从 SocketChannel 中读取 HTTP 标头集,如果指示升级,请切换到不同的库来处理 Websockets,并从那时起以完全不同的方式处理 SocketChannel 流,作为一组帧而不是行用 \r\n 分隔。

我知道我可以将任意数量的字节读入 ByteBuffer,但 Websockets 帧可能已随握手一起发送,我不想在这些代码段之间传递半消耗的缓冲区。我想要的是只从套接字读取直到并包括序列“\r\n\r\n”的数据。我想留在 SocketChannel 对象输入流中的任何数据。

推荐的方法是什么?从 SocketChannel 获取输入流并将其包装在缓冲阅读器中?这会与 NIO 正确交互,尤其是非阻塞使用吗?一旦检测到空行,我是否可以从输入流中删除缓冲读取器,并且当通道传递给 Websockets 代码时,所有帧数据仍然可用?

或者,也许我需要逐字节读取(或者如果某些目标“\r\n\r\n”字符出现在块的末尾,则为 4 字节块和较小的缓冲区)并构建我的标题字符串方式。

或者,如果缓冲区是直接分配的,那么操作标记、限制和位置的某种组合可能会允许输入流取回之前读入 ByteBuffer 的数据。

任何建议将不胜感激。

0 投票
3 回答
2019 浏览

java - Java 本机内存比堆快吗?

我正在探索帮助我的内存密集型应用程序的选项,并且在这样做时我遇到了 Terracotta 的BigMemory。据我所知,它们利用了非垃圾收集的堆外“本机内存”,由于序列化/反序列化问题,这显然比堆存储慢 10 倍。在阅读 BigMemory 之前,我从未听说过普通 JNI 之外的“本机内存”。尽管 BigMemory 是一个值得进一步考虑的有趣选项,但如果可以绕过序列化问题,我对使用本机内存可以完成的事情很感兴趣。

ByteBuffer当没有序列化问题时(例如,如果我将它与巨大的byte[]. 还是垃圾收集等的变幻莫测使这个问题无法回答?我知道“测量它”是一个常见的答案,但恐怕我不会设置一个有代表性的测试,因为我还不够了解 Java 中的原生内存是如何工作的。

0 投票
1 回答
223 浏览

android - Android ByteBuffer.asXxxBuffer 忽略位置?

我正在尝试读取包含顶点和元素的内存映射文件,以便在 OpenGL 中进行渲染。该文件正确加载到 iPhone 应用程序中,但我无法理解如何在 Android 中执行相同操作。我一直在与 ByteBuffer、FloatBuffer 和 IntBuffer 作斗争,它们的行为的一个方面让我感到困惑。

以下代码尝试读取一个长度,为顶点数据设置一个 FloatBuffer,读取顶点数据之后的另一个长度,并为元素数据设置一个 ShortBuffer。

根据我对文档的解释,asIntBuffer调用应该返回一个缓冲区到从当前位置开始的字节,一直到缓冲区的末尾。换句话说,它应该忽略我通过调用跳过的顶点数据data.position(data.position() + lenVerts)

问题是它似乎没有这样做。无论我传递什么值data.position(...),调用asIntBuffer总是返回一个缓冲区到整个底层 ByteBuffer。通过注意到lenVerts == lenElems(即,相同的值被读取两次,即使顶点和元素数据的大小不同)以及data.capacity() == 4*ib.capacity()(即 ByteBuffer 的字节数是 IntBuffer 的整数的四倍),这一点得到了双重证实.

难道我做错了什么?我是否错误地解释了文档?

如何创建仅由底层 ByteBuffer 的一部分支持的 XxxBuffer?

0 投票
3 回答
17014 浏览

java - 快速 ByteBuffer 到 CharBuffer 或 char[]

将 ajava.nio.ByteBuffer a转换为(新创建的)CharBuffer bchar[] b.

通过这样做,重要的是a[i] == b[i]. 这意味着,不a[i]a[i+1]一起构成一个值b[j]getChar(i)会做什么,但值应该是“传播”的。

请注意,与byte:-128具有相同(低 8 位)位char:128。因此,我假设“最佳”解释就像我上面提到的那样,因为位是相同的。

之后我还需要反之亦然的翻译:获取char[]java.nio.CharBuffer返回到java.nio.ByteBuffer.

0 投票
2 回答
7627 浏览

java - java.nio bytebuffer.put(byte[] arsrc, int offset , int length) 抛出的 IndexOutOfBoundsException

大家好,我希望有人可以帮助我解决这个问题..

我很好奇为什么我会收到这个运行时错误,从我的角度来看,我不应该是这里的代码部分:

这是我运行程序时显示的内容:

这是在 LU62XnsCvr 类中对它的任何引用之前声明的整数变量 MGBUFLN

这是用作声明为 LU62XnsCvr 类成员变量的“源”的字节数组...

这是我从 Oracle Java Doc 网站复制的;不知道它到底有多新,
但它被标记为 java 6 并且我正在运行使用 java 1.6 的 IBM 的 SDK

public ByteBuffer put(byte[] src, int offset, int length)

相对批量 put 方法(可选操作)。此方法将字节从给定的源数组传输到此缓冲区。如果要从数组复制的字节数多于此缓冲区中的剩余字节数,即如果 length > remaining(),则不传输任何字节并抛出 BufferOverflowException。否则,此方法将给定数组中的长度字节复制到此缓冲区中,从数组中的给定偏移量和此缓冲区的当前位置开始。然后这个缓冲区的位置按长度递增。换句话说,对表单的这个方法的调用dst.put(src, off, len)与循环的效果完全相同

除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。

参数:

  • src - 要从中读取字节的数组
  • offset - 要读取的第一个字节在数组中的偏移量;必须为非负且不大于 array.length
  • length - 要从给定数组中读取的字节数;必须为非负且不大于 array.length - 偏移量

返回:这个缓冲区

抛出:

  • BufferOverflowException - 如果此缓冲区中没有足够的空间
  • IndexOutOfBoundsException - 如果 offset 和 length 参数的先决条件不成立
  • ReadOnlyBufferException - 如果此缓冲区是只读的

我有点担心这些陈述:

否则,此方法将给定数组中的长度字节复制到此缓冲区中,从数组中的给定偏移量和此缓冲区的当前位置开始。然后这个缓冲区的位置按长度递增。

进而:

除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。

// * 我的附加评论 * //

现在我想完全“填充” 192 字节缓冲区(因此索引范围为 0 - 191)
所以如果在文档中提出,缓冲区“增加”长度
(在这种情况下为 192 字节)

然后在我看来,暗示“逻辑”将在索引中添加 192 个字节,
然后看……我们超出了索引的范围……

我真的很感谢任何人对此的看法。
等待您的意见和/或建议...

谢谢

盖伊

0 投票
1 回答
3465 浏览

java - 使用 FileChannels 在 Java 中连接大文件的效率更高的方法是什么

我想找出我想出的在 Java 中连接我的文本文件的两种方法中哪种方法更好。如果有人有一些见解,他们可以分享内核级别发生的事情,解释这些写入 FileChannel 的方法之间的区别,我将不胜感激。

根据我从文档和其他 Stack Overflow 对话中了解到的情况,allocateDirect 在驱动器上分配空间,并且主要避免使用 RAM。我担心如果 File infile 很大,比如 1GB,使用 allocateDirect 创建的 ByteBuffer 可能会溢出或不被分配。在开发我们的软件时,我保证文件不会大于 2 GB;但未来有可能达到 10 或 20GB。

我观察到 transferFrom 循环永远不会多次通过循环......所以它似乎一次成功地写入了整个 infile;但我没有用大于 60MB 的文件对其进行测试。我还是循环了,因为文档指定不能保证一次写多少。在我的系统上,由于 transferFrom 只能接受 int32 作为其计数参数,我将无法一次指定超过 2GB 的传输...再次,内核专业知识将帮助我理解。

在此先感谢您的帮助!!

使用 ByteBuffer

使用 trasferTo(或 transferFrom)

0 投票
3 回答
2155 浏览

java - java memcopy DirectBuffer

嗨,我正在使用 Java 中的直接缓冲区,我需要对它们进行快速内存复制。在 C 中有 memcpy 命令,在 Java Arrays 中有 Arrays.copyOf。但是没有办法使用数组代替直接缓冲区,因为我需要将它们传输到 OpenGL。

0 投票
2 回答
894 浏览

java - 是否有与 C 中的指针函数类似的 java ByteBuffer 函数

我正在使用 ByteBuffer 通过 java nio 传输数据。同一条消息可以发送给多个接收者。消息格式为“消息头+消息内容”。一种简单的方法是为每个接收器分配一个新的字节缓冲区。这不是有效的。

我的问题是 ByteBuffer 是否有类似的 java 函数指向 C/C++ 中的指针函数。所以我可以使用一个缓冲区来保存消息内容并与不同的标头连接。这样,就是效率。

谢谢。