关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
5年前关闭。
Improve this question
我经常在我们的 Java EE 应用程序套件中处理不同的二进制文件格式,即读入一些类结构并将它们写回。我需要进行以下操作:
| uint16_t | 4 bits | 4 bits | uint16_t |
应该变成这样
a = stream.readUint16();
byte tmp = stream.readUint8();
b = (tmp & 0xf0) >> 4;
c = (tmp & 0xf)
d = stream.readUint16();
\0
的动态长度字符串结尾 typedef struct
慢一个数量级在 C 中,将其作为块读取并在内存中进行类型转换 到目前为止,我已经分析了我的选择,发现有:
RandomAccessFile
— 标准 Java 中最好的一个,具有适当的查找和定位方法、字符串读取等,但有时由于在诸如 ;也没有对流的位级访问,也没有不同的字节序支持 FileInputStream
— 只能读取单个字节,必须手动重建原始数据类型;不求人*Reader
interaces — 基本上,只能读取字节和字节数组,可以跳过、标记和重置,但如果多次进行查找,它们往往会泄漏内存,如 reset(); skip(seekAmount);
我搜索过谷歌,我搜索过 StackOverflow。这个问题 -
How to parse/encode binary message formats? - 解决了同样的问题,但有我没有的奇怪的非对齐位要求。
所以,问题是——我是否忽略了一些东西,对于这个问题有没有更好的解决方案来解决我提到的所有问题?
最佳答案
ByteBuffer拥有您需要的一切。
它也可能是纯 Java 中最快的选项(不包括 JNI、sun.misc.Unsafe 等)
get
, getShort
, getInt
等读取所有原始类型和字节数组; order
在 BIG_ENDIAN 和 LITTLE_ENDIAN 之间切换; position
为了寻求; CharsetEncoder
, CharsetDecoder
可以直接在 ByteBuffer 中编码/解码字符串; FileChannel.map
创建一个映射到文件的 ByteBuffer; 关于java - 快速 Java 二进制格式解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957170/