java - 快速 Java 二进制格式解析

标签 java performance parsing binary

关闭。这个问题不满足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);
  • https://github.com/raydac/java-binary-block-parser - 几乎正是我正在寻找的 - 即格式的声明性规范,然后,瞧,我有类,但它本质上是一个解释器,因此有两个主要问题:(a)它在高要求中很慢环境,(b) 运行时生成的类似反射的样式存在多种类型安全问题
  • http://preon.codehaus.org/ — 有很多好评,但似乎不再开发,网站已关闭:(

  • 我搜索过谷歌,我搜索过 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 堆中和堆外数据有两种 ByteBuffers。
  • 关于java - 快速 Java 二进制格式解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957170/

    相关文章:

    java - 如果满足条件,则将值添加到 HashMap 中的键

    java - 从文件读取,内存不足

    c# - ASP.NET 启动性能分析 web

    python - 从对象重建源

    java - 尝试在 Grails 中发送 SimpleMailMessage 时必须首先发出 STARTTLS 命令

    java - Executor 和 PriorityBlockingQueue 上的 ASyncTask

    c# - 反射有多慢

    c - 性能比较 : 64 bit and 32 bit multiplication

    使用用户定义的运算符优先级进行解析

    Python获取文件中的行号