2016-01-19 22 views
0

这是我读取平坦缓冲区文件的代码。我总是得到一个EOF异常。我要如何摆脱这一例外的......读取平坦缓冲区总是会在最后一行后出现EOF异常

File file = new File("/Users/samarnath/RmsOne/CreateFlatBuffer/src/com/rms/objects/SingleCoverRiskPolicy.fb"); 
    RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); 
    int size; 
    byte[] data = new byte[0]; 

    while ((randomAccessFile.read(data, 0, 0)) != -1) 
    { 
     try { 
      size = randomAccessFile.readInt(); 
      data = new byte[size]; 
      randomAccessFile.read(data, 0, size); 

      ByteBuffer bb = ByteBuffer.wrap(data); 
      SingleCoverRiskPolicy singleCoverRiskPolicy = SingleCoverRiskPolicy.getRootAsSingleCoverRiskPolicy(bb); 
      System.out.println(singleCoverRiskPolicy.id()); 

     } catch (EOFException e) { 

      randomAccessFile.close(); 
      e.printStackTrace(); 
     } 
    } 

回答

1

我对你的代码...首先感到困惑,byte[] data = new byte[0];没有任何用处,因为您以后将其覆盖。其次,你在try-catch之外创建new RandomAccessFile()。第三,您似乎将0的字节长度传递到randomAccessFile.read(buffer, offset, length)。如果你对这些有意义,请评论澄清。

如果你看一下Java测试文件,他们有可以参考的例子:https://github.com/google/flatbuffers/blob/master/tests/JavaTest.java#L30

尝试是这样的:

*注:我没有编译此代码。但它应该足够相似以解决您的问题。

File file = new File("/Users/samarnath/RmsOne/CreateFlatBuffer/src/com/rms/objects/SingleCoverRiskPolicy.fb"); 
RandomAccessFile randomAccessFile = null; 
byte[] data = null; 

try { 
    randomAccessFile = new RandomAccessFile(file, "r"); 
    data = new byte[(int)randomAccessFile.length()]; 
    randomAccessFile.readFully(data); 
    randomAccessFile.close(); 
} catch(java.lang.IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch(java.io.IOException e) { 
    e.printStackTrace(); 
} catch(java.io.FileNotFoundException e) { 
    e.printStackTrace() 
} catch(java.lang.SecurityException e) { 
    e.printStackTrace() 
} // Note: You can clean up these exceptions as needed (depending on your Java version). 

// You're done reading it, now convert to a ByteBuffer and begin using. 
ByteBuffer bb = ByteBuffer.wrap(data); 
SingleCoverRiskPolicy singleCoverRiskPolicy = SingleCoverRiskPolicy.getRootAsSingleCoverRiskPolicy(bb); 
System.out.println(singleCoverRiskPolicy.id());