Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速Java二进制格式解析_Java_Performance_Parsing_Binary - Fatal编程技术网

快速Java二进制格式解析

快速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

我经常在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 & 0xf)
    d = stream.readUint16();
    
  • 以不同的编码读取字符串,有时动态长度字符串的结尾类似于
    \0

  • 在文件中查找(查找由读取的某些偏移量指定的数据),知道当前位置,知道在当前数据块中还有多少要解析
  • 最后,但并非最不重要的是,它应该是快速的;至少不比在C中声明一个
    typedef struct
    慢一个数量级,将其作为块读取并在内存中进行类型转换
到目前为止,我已经分析了我的选择,发现有:

  • RandomAccessFile
    -标准Java中最好的一个,具有适当的查找和定位方法、字符串读取等,但有时由于在以下操作中缺少缓冲而速度慢得令人无法忍受:;也没有对流的位级访问,也没有不同的端性支持
  • FileInputStream
    -只能读取单个字节,必须手动重建原始数据类型;不求
  • *读卡器
    交互-基本上,只能读取字节和字节数组,可以跳过、标记和重置,但如果像
    reset()一样多次执行查找,则它们往往会泄漏内存;跳过(见卡蒙特)
  • -几乎正是我想要的-例如,一个格式的声明性规范,然后,瞧,我有了类,但它本质上是一个解释器,因此有两个主要问题:(a)在高要求的环境中速度慢,(b)运行时生成的反射样式存在多类型安全问题
  • -有很多很棒的评论,但似乎不再发展,网站已关闭:(
我搜索过谷歌,我搜索过StackOverflow,这个问题- -解决了同样的问题,但我没有奇怪的不对齐位要求


所以,问题是——我是否忽略了一些东西,有没有更好的解决方案来解决我提到的所有问题呢?

我不想将此作为一种解决方案来建议,但鉴于您似乎对如何在C中实现这一点有一定的了解,您可以在C中构建一个适当的函数库,然后用JNI将其包装并使用t在你的申请表中

也许这只是“本土化”适合您的用例的少数情况之一?

拥有您所需要的一切。
它可能也是纯Java中最快的选项(不包括JNI、sun.misc.Unsafe等)

  • 等来读取所有基元类型和字节数组
  • 在大端点和小端点之间切换
  • 寻找
  • ,可以直接在ByteBuffer中对字符串进行编码/解码
  • 创建映射到文件的ByteBuffer
  • Java堆内和堆外数据有两种字节缓冲区
是活生生的,只是不再是Codehaus了。但是,我不认为这对你有多大帮助,因为你没有处理未对齐的结构。