Java从文件中读取结构化二进制数据

时间:2017-06-20 22:57:35

标签: java binaryfiles

我最近开始学习Java,因为我真的是那种学习手头任务更快的人,我决定用C#编写一个小应用程序并用Java创建一个等价的。

也许我应该从较小的任务开始,但是因为我已经开始设计它(C#app编写得不是很好,因此在功能方面创建了一个等效的应用程序,而不是设计和结构),我不知道感觉好像放弃了我的想法。

嗯,正如你现在可能已经意识到的那样,读到这个,我被困住了。该应用程序是一种编辑器,它对存储在二进制文件中的数据起作用。我目前无法弄清楚的是如何阅读这个文件(有一件事是阅读)和解析(提取)我需要的数据。我知道这个文件的结构。所以这是我正在寻找的东西:

  1. 我应该如何访问存储在文件中的二进制数据(在C#中我会使用BinaryReader)
  2. 如何处理Java中不可用的原语(uint8_t,uint16_t,因为该文件是用C ++创建的)
  3. 修改

    我应该也提到我可能需要在处理之前将整个文件加载到内存中!该文件为2MB。

    在处理二进制文件和流时,我常常迷路:x

    编辑2

    我想我在此期间想出来了。我需要首先验证4字节签名。所以我这样做:

    byte[] identifier = {'A', 'B', 'C', 'D'};
    fs = new FileInputStream(filename);
    byte[] extractedIdentifier = new byte[4];
    if(4 != fs.read(extractedIdentifier)) {
        throw new Exception();
    }
    
    if(!Arrays.equals(identifier, extractedIdentifier)) {
        throw new Exception();
    }
    

    之后我还需要整个文件,所以我发现MappedByteBuffer https://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html我认为我会调查,因为它看起来似乎是乍看之下的完美解决方案。

    FileChannel fc = fs.getChannel();
    MappedByteBuffer buf = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
    

    由于我刚开始阅读此内容,使用此方法有任何副作用吗?有更好的方法吗?

0 个答案:

没有答案