Как узнать, сколько байтов было получено от GSON JsonReader

Во время чтения здесь и создания большого объекта для отправки и получения с использованием JsonWriter и JsonReader. Я хотел отслеживать общее количество отправленных байтов.

3 ответа

Решение

Там нет ничего в JsonWriter или же JsonReader это обеспечит это для вас.

Единственный способ сделать это - обернуть / расширить Reader или же Writer вы в настоящее время переходите к JsonReader/JsonWriter и следить за байтами, которые читаются / записываются в / из.

Изменить, чтобы добавить: В качестве примера вы могли бы сделать что-то вроде:

class MyWriterWrapper extends Writer {

    private Writer realWriter;
    private int bytesWritten;

    public MyWriterWrapper(Writer realWriter) {
        super(); 
        this.realWriter = realWriter;
    }

    public int getBytesWritten() {
        return bytesWritten;
    }

    @Override
    public Writer append(CharSequence csq) throws IOException {
         realWriter.append(csq);
         bytesWritten += csq.length();
         return this;
    }

    // Implement/Override all other Writer methods the same way

}

Было бы намного чище, если бы Writer был интерфейс, но... Мех, что вы можете сделать. Если вы знаете, что когда-либо будете использовать только один тип Writer (скажем, BufferedWriter) вы можете расширить это, переопределить все методы и повторно вызвать методы на this вместо частного realWriter экземпляр передается через конструктор.

Ни за что. Даже если вы оберните свой входной поток в какую-нибудь оболочку для подсчета байтов (например, в apache's CountingInputStream), результаты будут неверными из-за внутренней буферизации JsonReader. Я экспериментировал с JSON длиной ~ 300 байт. CountingInputStream сообщил, что каждый раз читалось ~4kb.

По умолчанию нет способа получить количество полученных байтов от JsonReader. Я написал небольшой хитрый взлом, который упоминается ниже:

  1. Чтение байтов из inputtream и запись их в файл внутреннего хранилища

    while ((count = inputStream.read(data)) != -1)  {
                  total += count;
                  final long downloadedLength = total;
                  final long totalLength = lengthOfData;
               **// Here you get the size of bytes received**
                  outStream.write(data, 0, count);
              }
    
  2. Закройте все открытые потоки (потоки ввода и вывода, созданные выше)

  3. Откройте входной поток вновь созданного файла

    InputStream stream = mContext.openFileInput (FILE_NAME);
    InputStreamReader inputStreamReader = new InputStreamReader (stream);

  4. Теперь у вас есть входной поток (поток) для JsonReader

  5. Позвольте JsonReader использовать этот входной поток для анализа данных

  6. После завершения анализа удалите созданный вами файл для временного использования.

    InputStream stream = mContext.openFileInput (FILE_NAME);
    InputStreamReader inputStreamReader = new InputStreamReader (stream);
    jsonReader = новый JsonReader (inputStreamReader);
    parseMyJSON (jsonReader);

    Файл file = новый файл (mContext.getFilesDir (), FILE_NAME);
    file.delete ();

Другие вопросы по тегам