快速Java二进制格式解析
我经常在JavaEE应用程序套件中处理不同的二进制文件格式,即读入一些类结构并将其写回。我需要进行如下操作:快速Java二进制格式解析,java,performance,parsing,binary,Java,Performance,Parsing,Binary,我经常在JavaEE应用程序套件中处理不同的二进制文件格式,即读入一些类结构并将其写回。我需要进行如下操作: 读取单字节/short/int/long,有时不同的尾数(小/大) 读取标志中的单个位,即 | uint16_t | 4 bits | 4 bits | uint16_t | 应该变成 a = stream.readUint16(); byte tmp = stream.readUint8(); b = (tmp & 0xf0) >> 4; c = (tmp &a
- 读取单字节/short/int/long,有时不同的尾数(小/大)
- 读取标志中的单个位,即
应该变成| 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
- 在文件中查找(查找由读取的某些偏移量指定的数据),知道当前位置,知道在当前数据块中还有多少要解析
- 最后,但并非最不重要的是,它应该是快速的;至少不比在C中声明一个
慢一个数量级,将其作为块读取并在内存中进行类型转换typedef struct
-标准Java中最好的一个,具有适当的查找和定位方法、字符串读取等,但有时由于在以下操作中缺少缓冲而速度慢得令人无法忍受:;也没有对流的位级访问,也没有不同的端性支持RandomAccessFile
-只能读取单个字节,必须手动重建原始数据类型;不求FileInputStream
交互-基本上,只能读取字节和字节数组,可以跳过、标记和重置,但如果像*读卡器
reset()一样多次执行查找,则它们往往会泄漏内存;跳过(见卡蒙特)代码>
- -几乎正是我想要的-例如,一个格式的声明性规范,然后,瞧,我有了类,但它本质上是一个解释器,因此有两个主要问题:(a)在高要求的环境中速度慢,(b)运行时生成的反射样式存在多类型安全问题
- -有很多很棒的评论,但似乎不再发展,网站已关闭:(
所以,问题是——我是否忽略了一些东西,有没有更好的解决方案来解决我提到的所有问题呢?我不想将此作为一种解决方案来建议,但鉴于您似乎对如何在C中实现这一点有一定的了解,您可以在C中构建一个适当的函数库,然后用JNI将其包装并使用t在你的申请表中 也许这只是“本土化”适合您的用例的少数情况之一?拥有您所需要的一切。
它可能也是纯Java中最快的选项(不包括JNI、sun.misc.Unsafe等)
- 等来读取所有基元类型和字节数组
- 在大端点和小端点之间切换
- 寻找
- ,可以直接在ByteBuffer中对字符串进行编码/解码
- 创建映射到文件的ByteBuffer
- Java堆内和堆外数据有两种字节缓冲区