0

在此处阅读并使用 JsonWriter 和 JsonReader 创建一个要发送和接收的大型对象时。我想跟踪发送的总字节数。

4

3 回答 3

2

没有任何东西JsonWriter可以JsonReader为你提供这些。

真正做到这一点的唯一方法是包装/扩展ReaderWriter您当前传递给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(例如 a BufferedWriter),您可以扩展它,覆盖所有方法并重新调用方法,而不是通过构造函数传入 this的私有实例。realWriter

于 2013-02-15T22:31:57.163 回答
0

没有从 JsonReader 获取接收字节数的默认方法。我写了一个有点棘手的 Hack,如下所述:

  1. 从输入流中读取字节并将它们写入内部存储文件

    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 流 = mContext.openFileInput(FILE_NAME);
    InputStreamReader inputStreamReader = new InputStreamReader(stream);

  4. 现在你有一个 JsonReader 的输入流(流)

  5. 让 JsonReader 使用这个输入流来解析数据

  6. 解析完成后,删除你创建的临时使用的文件

    InputStream 流 = mContext.openFileInput(FILE_NAME);
    InputStreamReader inputStreamReader = new InputStreamReader(stream);
    jsonReader = new JsonReader(inputStreamReader);
    parseMyJSON(jsonReader);

    文件 file = new File(mContext.getFilesDir(), FILE_NAME);
    文件.删除();

于 2014-06-17T07:04:31.463 回答
0

没门。即使您将输入流包装在某种包装器中以计算字节数(例如 apache 的 CountingInputStream),由于 JsonReader 的内部缓冲,结果也会不正确。我已经尝试了大约 300 字节长的 JSON。CountingInputStream 报告每次读取约 4kb。

于 2015-10-06T08:44:45.457 回答