2013-02-14 2 views

ответ

2

Нет ничего в 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 экземпляра, переданного через конструктор.

+0

Это были мои мысли. Приятно, если бы был клон gson с этой возможностью, будет один, если я получу то далекое – Erik

+0

Это относится только к Writer, а не к Reader. –

0

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

  1. Чтение байтов из 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); 
          } 
    
  2. Закрыть все открытые потоки (входные и выходные потоки, созданные выше)

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

    InputStream stream = mContext.openFileInput (FILE_NAME);
    InputStreamReader inputStreamReader = новый InputStreamReader (поток);

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

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

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

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

    Файл файла = новый Файл (mContext.getFilesDir(), FILE_NAME);
    файл.Удалить();

0

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