При чтении here и создании большого объекта для отправки и получения с использованием JsonWriter и JsonReader. Я хотел отслеживать количество отправленных байтов.Как я могу узнать, сколько байтов было получено от GSON JsonReader
ответ
Нет ничего в 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
экземпляра, переданного через конструктор.
Существует нет способа по умолчанию получить количество полученных байтов от JsonReader. Я написал немного каверзный Hack, который упоминается ниже:
Чтение байтов из InputStream и записать их в файл внутреннего хранения
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 = новый InputStreamReader (поток);Теперь у вас есть InputStream (поток) для JsonReader
Пусть JsonReader использовать этот InputStream для данных синтаксического анализа
После разбора завершена, удалите файл, созданный для временного использования
InputStream stream = mContext.openFileInput (FILE_NAME);
InputStreamReader inputStreamReader = новый InputStreamReader (поток);
jsonReader = новый JsonReader (inputStreamReader);
parseMyJSON (jsonReader);Файл файла = новый Файл (mContext.getFilesDir(), FILE_NAME);
файл.Удалить();
Ни в коем случае. Даже если вы оберните свой поток ввода в какой-то обертке для подсчета байтов (например, CountingInputStream apache), результаты будут неверными из-за внутренней буферизации JsonReader. Я экспериментировал с JSON размером ~ 300 байт. CountingInputStream сообщал, что ~ 4kb читается каждый раз.
Это были мои мысли. Приятно, если бы был клон gson с этой возможностью, будет один, если я получу то далекое – Erik
Это относится только к Writer, а не к Reader. –