Как узнать, сколько байтов было получено от 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. Я написал небольшой хитрый взлом, который упоминается ниже:
Чтение байтов из 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); }
Закройте все открытые потоки (потоки ввода и вывода, созданные выше)
Откройте входной поток вновь созданного файла
InputStream stream = mContext.openFileInput (FILE_NAME);
InputStreamReader inputStreamReader = new InputStreamReader (stream);Теперь у вас есть входной поток (поток) для JsonReader
Позвольте JsonReader использовать этот входной поток для анализа данных
После завершения анализа удалите созданный вами файл для временного использования.
InputStream stream = mContext.openFileInput (FILE_NAME);
InputStreamReader inputStreamReader = new InputStreamReader (stream);
jsonReader = новый JsonReader (inputStreamReader);
parseMyJSON (jsonReader);Файл file = новый файл (mContext.getFilesDir (), FILE_NAME);
file.delete ();