问题标签 [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 投票
6 回答
8481 浏览

java - 使用 Bytebuffers 和 NIO 时如何避免 OutOfMemoryError?

我正在使用ByteBuffers并将FileChannels二进制数据写入文件。当为大文件或连续为多个文件执行此操作时,我得到一个OutOfMemoryError例外。我在其他地方读到过,Bytebuffers与 NIO 一起使用是坏的,应该避免。你们中是否有人已经遇到过此类问题并找到了一种解决方案,可以有效地将大量二进制数据保存在 java 文件中?

jvm选项-XX:MaxDirectMemorySize是要走的路吗?

0 投票
1 回答
30927 浏览

java - 如何将 ByteBuffer 的内容放入 OutputStream?

我需要将 a 的内容java.nio.ByteBuffer放入java.io.OutputStream. (希望我有一个Channel,但我没有)最好的方法是什么?

我不能使用 ByteBuffer 的array()方法,因为它可以是只读缓冲区。

我也可能在使用此 ByteBuffer 和拥有一个可以直接使用的常规数组之间散布对 OutputStream 的byte[]写入OutputStream.write()

0 投票
4 回答
2751 浏览

java - 从长度为无符号整数的 ByteBuffer 中读取 UTF-8 字符串

我正在尝试通过 java.nio.ByteBuffer 读取 UTF8 字符串。大小是一个未分割的 int,当然,Java 没有。我已将值读入 long 以便我拥有该值。

我遇到的下一个问题是我无法使用 long 创建一个字节数组,并且将他的 long 转换回 int 会导致它被签名。

我也尝试在缓冲区上使用 limit() ,但它同样适用于 int 不长。

我正在做的具体事情是从类文件中读取 UTF8 字符串,因此缓冲区中的内容不仅仅是 UTF8 字符串。

关于如何从 ByteBuffer 读取可能长度为 unsigned int 的 UTF8 字符串的任何想法。

编辑:

这是该问题的一个示例

因此,从技术角度来看,类文件中可能有一个长度为完整 u4(无符号,4 个字节)的字符串。

如果 UTF8 字符串的大小有限制,这些都不是问题(我不是 UTF8 专家,所以可能有这样的限制)。

我可以坚持下去并接受这样一个现实,即不会有这么长的字符串......

0 投票
7 回答
7808 浏览

java - 扩展 ByteBuffer 类

有没有办法创建扩展 ByteBuffer 类的类?

ByteBuffer 中的一些抽象方法是包私有的,如果我创建包 java.nio,则会引发安全异常。

出于性能原因,我想这样做——例如 getInt 有大约 10 个方法调用,以及相当多的 if 方法。即使保留所有检查,并且仅内联方法调用并删除大/小端检查,我创建的测试表明它可以快 4 倍左右。

0 投票
6 回答
144702 浏览

java - Gets byte array from a ByteBuffer in java

Is this the recommended way to get the bytes from the ByteBuffer

0 投票
2 回答
1468 浏览

java - Java 字节缓冲区到 C

在 Windows 上的 C 程序中,我们需要像 Java 字节缓冲区一样读写,它将二进制文件存储在 BIG_ENDIAN 中

该算法描述于: http: //mindprod.com/jgloss/binaryformats.html

需要读写int和float。

有没有人有执行此操作的示例 c 或 C++ 代码或参考?

TIA,伯特

0 投票
3 回答
5574 浏览

java - 是否可以将 Process stdout InputStream 读入 NIO ByteBuffer?

是否可以使用 NIO 处理来自 Process 的标准输出?我让它与 java.io 一起工作,但这是一个练习,可以更多地了解 NIO 并探索性能改进的可能性。

基本上,我想尽可能快地将大量文本从标准输出流式传输到缓冲区而不会阻塞,然后稍后处理该缓冲区的内容。问题是,我似乎无法找出正确的巫术来使它与 NIO 一起工作。这就是我现在的位置:

StreamConsumer 类如下所示:

0 投票
3 回答
24245 浏览

java - 大ByteBuffer的BufferedReader?

有没有办法用 BufferedReader 读取 ByteBuffer 而不必先将其转换为 String ?我想将相当大的 ByteBuffer 作为文本行读取,出于性能原因,我想避免将其写入磁盘。在 ByteBuffer 上调用 toString 不起作用,因为生成的 String 太大(它抛出 java.lang.OutOfMemoryError: Java heap space)。我原以为 API 中有一些东西可以将 ByteBuffer 包装在合适的阅读器中,但我似乎找不到任何合适的东西。

这是一个简短的代码示例,说明了我在做什么):

0 投票
2 回答
1445 浏览

java - JAVA NIO ByteBuffer 分配以适应最大的数据集?

我正在开发一款在线游戏,在服务器端工作时遇到了一些问题。

在 Java 中使用非阻塞套接字时,处理在所有数据可用之前无法处理的完整数据包数据集的最佳操作方案是什么?例如,通过套接字发送大型 2D 平铺地图。

我可以想到两种方法来处理它:

  1. 分配足够大的 ByteBuffer 以处理处理我的示例中的大型 2D 平铺地图所需的完整数据集。继续将读取数据添加到缓冲区,直到它全部被接收并从那里处理。

  2. 如果 ByteBuffer 的大小较小(可能为 1500),则可以完成后续读取并将其放入文件中,直到可以从文件中完全处理它。这将避免必须拥有大的 ByteBuffer,但会因为磁盘 I/O 而降低性能。

我为每个 SocketChannel 使用了一个专用的 ByteBuffer,这样我就可以继续读取数据,直到它完成处理。问题是,如果我的 2D Tiled Map 大小达到 2MB,那么使用 1000 个 2MB ByteBuffers 真的明智吗(假设 1000 是客户端连接限制并且它们都在使用中)?一定有更好的方法,我没有想到。

我宁愿保持简单,但我愿意接受任何建议并感谢您的帮助。谢谢!

0 投票
1 回答
7501 浏览

java - .array() 为何不适用于从映射的 FileChannels 返回的 ByteBuffers?

我正在用 Java 做内存映射 IO。FileChannel 类允许您将 ByteBuffer 映射到文件的特定部分。我正在使用只读打开的文件来执行此操作。

我遇到的问题是,当我尝试在生成的 ByteBuffer 上调用 .array() 方法时出现异常。也许那是因为 .array() 返回一个 byte[] 数组,而我真的想要一个最终的字节数组?

有没有办法解决?