Запись плоского буфера в двоичном файле в android дает только один ответ - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в Flatbuffer. Я создал файл схемы из-за пределов проекта и добавил пользователя (Monster, как в документе Flatbuffer) внутри двоичного файла с помощью java кода в android. все отлично работает но время чтения двоичных данных файла дает мне только длину пользователя 1. Я добавил 3 человек, но это дает мне длину монстров 1 на момент чтения. Может ли кто-нибудь помочь выяснить это. Вот код ->

это полный код ->

введите код здесь

  builder = new FlatBufferBuilder(1024);

  public void addNewData(String emailOffset, String nameOffset,String 
  contactNoOffset, String DOJOffset, String departmentOffset, 
  String empIdOffset, float[] embeddingOffset)

  {
   int storeembedd = SingleJson.createEmbeddingVector(builder, 
    embeddingOffset);
    int hereEmailOffset = builder.createString(emailOffset);
    int hereNameOffset = builder.createString(nameOffset);
    int hereContactOffset = builder.createString(contactNoOffset);
    int hereDOJOffset = builder.createString(DOJOffset);
    int hereDepartmentOffset=builder.createString(departmentOffset);
    int hereImpIdOffset = builder.createString(empIdOffset);


    int test = SingleJson.createSingleJson(builder, hereEmailOffset, 
               hereNameOffset, hereContactOffset
             , hereDOJOffset, hereDepartmentOffset, hereImpIdOffset, 
              storeembedd);

    int [] offsetOfMonster = new int[1];
    offsetOfMonster[0] = test;
    int temp = Monsters.createMonstersVector(builder, 
    offsetOfMonster);

    Monsters.startMonsters(builder);
    Monsters.addMonsters(builder, temp);
    int orc =  Monsters.endMonsters(builder);



    builder.finish(orc);

    byte[] buf1 = builder.sizedByteArray();

    openAndAppenedInBinary(buf1);
}


private void openAndAppenedInBinary(byte[] buf1) {
    FileOutputStream output = null;
    try {

        InputStream inputStream = new FileInputStream(newFile());

        byte[] buffer = new byte[inputStream.available()];
        if (inputStream.available() == 0) {
            output = new FileOutputStream(newFile(), true);
            output.write(buf1);
        } else {
            while (inputStream.read(buffer) != -1) {
                output = new FileOutputStream(newFile(), true);
                output.write(buffer);
                output.write(buf1);
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

private String newFile() {

    File file = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + context.getPackageName()
            + "/binFile");

    if (!file.exists()) {
        if (!file.mkdir()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                try {
                    Path dir = Paths.get(file.getAbsolutePath());
                    Files.createDirectory(dir);
                } catch (IOException e) {
                    Path parentDir = Paths.get(file.getParent());
                    if (!Files.exists(parentDir)) {
                        try {
                            Files.createDirectories(parentDir);
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    File binFile = new File(file, "renamed.bin");
    try {

        FileWriter writer = new FileWriter(binFile);
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return binFile.getAbsolutePath();
}

вот мой код чтения flatbiffer ->

new FlatParsingForPerticularId (). Execute (readRawResource (R.raw.renamed));; // переименовано в мой файл bin

закрытый класс FlatParsingForPerticularId расширяет AsyncTask {

    @Override
    protected String doInBackground(Object... params) {
        byte[] buffer = (byte[]) params[0];
        long startTime = System.currentTimeMillis();
        ByteBuffer bb = ByteBuffer.wrap(buffer);
        Monsters monsterList = Monsters.getRootAsMonsters(bb);
        int length = monsterList.monstersLength();
        SingleJson monster = null;
        for (int i = 0; i < length; i++) {//here I m getting length 1 intead of 3
            monster = monsterList.monsters(i);
           if (i == outputval[0]) {
                outputval[0] = (int) monster.EmpNo();
                break;
            }
        }


        long endTime = System.currentTimeMillis() - startTime;

        String textToShow = "Elements: " + monsterList.monstersLength() + ": load time: " + endTime + "ms";
        String[] monsterArr = monster.Name().split(" ");
        return monsterArr[0];
    }
...